在 R 中将列的值分组到类别中

Grouping values of a column into categories in R

提问人:melisa 提问时间:11/14/2023 更新时间:11/14/2023 访问量:46

问:

我在 R 中有数据,我想使用第一列中的值进行比较。类别名称已包含在该类别的实际值之前的第一列中。问题在于,就目前而言,类别名称被视为一个值。我想将这些数据组织成“A”和“B”类别(A和B不被视为值),然后在“团队A”和“团队B”之间进行比较。我该怎么做?

组织 A队 B队
一个 10 23
55 41
22 33
52 85
B 12 12
狮子 32 44
老虎 43 55
85 69
r 数据帧 dplyr tidyr

评论

2赞 MrFlick 11/14/2023
那么,这个样本输入的所需输出究竟是什么?

答:

0赞 Jon Spring 11/14/2023 #1

假设我们有一个类别列表,我们可以创建一个列,当它们匹配时从组织中复制这些值,并在 NA 上填充这些值。

library(tidyverse)
df1 |>
  mutate(category = if_else(Organization %in% c("A", "B"), Organization, NA)) |>
  fill(category)

结果

  Organization Team.A Team.B category
1            A     10     23        A
2          Cat     55     41        A
3          Dog     22     33        A
4          Pig     52     85        A
5            B     12     12        B
6         Lion     32     44        B
7        Tiger     43     55        B
8     Elephant     85     69        B

数据:

df1 <- data.frame(
  stringsAsFactors = FALSE,
      Organization = c("A","Cat","Dog","Pig","B",
                       "Lion","Tiger","Elephant"),
            Team.A = c(10L, 55L, 22L, 52L, 12L, 32L, 43L, 85L),
            Team.B = c(23L, 41L, 33L, 85L, 12L, 44L, 55L, 69L)
) 
0赞 Andre Wildberg 11/14/2023 #2

这会根据在组织中找到单个字符将数据分组/分类为“A”和“B”。

library(dplyr)

df %>% 
  group_by(grp = cumsum(nchar(Organization) == 1)) %>% 
  mutate(grp = first(Organization))
# A tibble: 8 × 4
# Groups:   grp [2]
  Organization `Team A` `Team B` grp  
  <chr>           <int>    <int> <chr>
1 A                  10       23 A    
2 Cat                55       41 A    
3 Dog                22       33 A    
4 Pig                52       85 A    
5 B                  12       12 B    
6 Lion               32       44 B    
7 Tiger              43       55 B    
8 Elephant           85       69 B

数据

df <- structure(list(Organization = c("A", "Cat", "Dog", "Pig", "B", 
"Lion", "Tiger", "Elephant"), `Team A` = c(10L, 55L, 22L, 52L, 
12L, 32L, 43L, 85L), `Team B` = c(23L, 41L, 33L, 85L, 12L, 44L, 
55L, 69L)), class = "data.frame", row.names = c(NA, -8L))