我有这样一个数据集:
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
- 应根据组合对观察结果进行分组
除了
conc
和uptake
之外的所有变量。所以我想指定 我不想用于分组的变量 - 我想向数据集中添加一个新变量
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/