r - 如何对除某些变量之外的所有变量进行分组并为每个观察添加一个组 ID

标签 r dplyr

我有这样一个数据集:

data(CO2, package = 'datasets')

##    Plant        Type  Treatment conc uptake
## 1    Qn1      Quebec nonchilled   95   16.0
## 2    Qn1      Quebec nonchilled  175   30.4
## ... 
## 17   Qn3      Quebec nonchilled  250   40.3
## 18   Qn3      Quebec nonchilled  350   42.1
## ...
## 27   Qc1      Quebec    chilled  675   35.4
## 28   Qc1      Quebec    chilled 1000   38.7
## ...
## 36   Qc3      Quebec    chilled   95   15.1
## 37   Qc3      Quebec    chilled  175   21.0
## ...
## 47   Mn1 Mississippi nonchilled  500   30.9
##  ...
## 53   Mn2 Mississippi nonchilled  350   31.8
## 54   Mn2 Mississippi nonchilled  500   32.4
## ...
## 62   Mn3 Mississippi nonchilled  675   28.1
## 63   Mn3 Mississippi nonchilled 1000   27.8
## ...
## 70   Mc1 Mississippi    chilled 1000   21.9
## 71   Mc2 Mississippi    chilled   95    7.7
## 72   Mc2 Mississippi    chilled  175   11.4
## ...
## 83   Mc3 Mississippi    chilled  675   18.9
## 84   Mc3 Mississippi    chilled 1000   19.9
  • 应根据组合对观察结果进行分组 除了 concuptake 之外的所有变量。所以我想指定 我不想用于分组的变量
  • 我想向数据集中添加一个新变量 GroupID,其中所有观察值 属于同一组的 GroupID
  • 值相同

我找到了一个可行的解决方案,但它是一个庞然大物:

library(dplyr)
CO2 %>% 
  mutate(GroupID=
         do.call( group_indices
                , c( list(.data=.)
                   , colnames(.) %>% 
                      setdiff(c('conc','uptake')) %>% 
                      as.name()
                   )
                )
         )

##    Plant        Type  Treatment conc uptake GroupID
## 1    Qn1      Quebec nonchilled   95   16.0       1
## 2    Qn1      Quebec nonchilled  175   30.4       1
## ...
## 8    Qn2      Quebec nonchilled   95   13.6       2
## 9    Qn2      Quebec nonchilled  175   27.3       2
## ...
## 15   Qn3      Quebec nonchilled   95   16.2       3
## 16   Qn3      Quebec nonchilled  175   32.4       3
## ...
## 22   Qc1      Quebec    chilled   95   14.2       4
## 23   Qc1      Quebec    chilled  175   24.1       4
## ...
## 29   Qc2      Quebec    chilled   95    9.3       6
## 30   Qc2      Quebec    chilled  175   27.3       6
## ...
## 36   Qc3      Quebec    chilled   95   15.1       5
## 37   Qc3      Quebec    chilled  175   21.0       5
## ...
## 43   Mn1 Mississippi nonchilled   95   10.6       9
## 44   Mn1 Mississippi nonchilled  175   19.2       9
## ...

有没有更简单的解决方案?


好处:如果有一个解决方案可以使用所有相同类型的变量(例如所有因子变量)进行分组,那将是一个爆炸。

最佳答案

我们可以使用group_by_if 根据条件对变量进行分组。在这种情况下,is.factor 用于评估列是否为因子。之后,group_indices 可以为每个组生成 ID。

library(dplyr)

CO2_2 <- CO2 %>%
  mutate(GroupID = CO2 %>%
           group_by_if(is.factor) %>%
           group_indices())
head(CO2_2)
#   Plant   Type  Treatment conc uptake GroupID
# 1   Qn1 Quebec nonchilled   95   16.0       1
# 2   Qn1 Quebec nonchilled  175   30.4       1
# 3   Qn1 Quebec nonchilled  250   34.8       1
# 4   Qn1 Quebec nonchilled  350   37.2       1
# 5   Qn1 Quebec nonchilled  500   35.3       1
# 6   Qn1 Quebec nonchilled  675   39.2       1

我们还可以使用 group_by_at 根据列名对数据框进行分组。

CO2_3 <- CO2 %>%
  mutate(GroupID = CO2 %>%
           group_by_at(vars(-conc, -uptake)) %>%
           group_indices())
head(CO2_3)
#   Plant   Type  Treatment conc uptake GroupID
# 1   Qn1 Quebec nonchilled   95   16.0       1
# 2   Qn1 Quebec nonchilled  175   30.4       1
# 3   Qn1 Quebec nonchilled  250   34.8       1
# 4   Qn1 Quebec nonchilled  350   37.2       1
# 5   Qn1 Quebec nonchilled  500   35.3       1
# 6   Qn1 Quebec nonchilled  675   39.2       1

关于r - 如何对除某些变量之外的所有变量进行分组并为每个观察添加一个组 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48562847/

相关文章:

r - 具有大量 tibbles 的 bind_rows

r - 如何 rbind()/dplyr::bind_rows()/data.table::rbindlist() 包含数据框列的数据框?

r - 将 Year 列复制到 R 中的 QuarterYear

r - dplyr 中的长变量名称失败

r - 在 R 中使用 t.test() 时出错 - 'y' 观察值不够

r - 使用 data.table set() 将所有列从整数转换为数字

r - 为什么 lmList 与 lmList[[x]] 得到不同的汇总结果

r - 制作 3d 表面

r - 在R中将一列分成n级列

r - 编译较旧的 R 版本并在 Ubuntu 和 RStudio 中的版本之间切换