如何在R中根据多变量等值条件为观测值自动创建分组变量
解决方案
方案1:tidyverse实现(推荐,适配灵活)
用dplyr的group_by() + cur_group_id()即可实现需求,该方法不需要提前知晓分组变量的取值,只需要指定要用于分组的列即可自动为所有取值完全相同的观测分配相同的组ID,组ID按分组组合首次出现的顺序生成。
代码示例:
library(dplyr) # 原始数据 df <- data.frame("Individuals" = c(1,2,3,4,5,6), "Height" = c(150, 200, 200, 200, 150, 150), "Weight" = c(100, 50, 50, 100, 50, 100)) # 指定需要用于分组的列,此处为Height和Weight,可自由替换为任意数量的列 output_df <- df %>% group_by(Height, Weight) %>% mutate(`Groups of individuals` = cur_group_id()) %>% ungroup()
运行后得到的结果和预期输出完全一致。如果后续需要增加分组变量,只需要在group_by()中添加对应列名即可,比如要新增年龄列作为分组维度,就改成group_by(Height, Weight, Age)。
方案2:base R实现(无需加载额外包)
如果不想依赖第三方包,可以用因子转整数的方式实现:
# 原始数据 df <- data.frame("Individuals" = c(1,2,3,4,5,6), "Height" = c(150, 200, 200, 200, 150, 150), "Weight" = c(100, 50, 50, 100, 50, 100)) # 指定分组列,此处写列名,也可以传列索引如c(2,3) group_cols <- c("Height", "Weight") # 生成组ID df$`Groups of individuals` <- as.integer(factor(do.call(paste, c(df[group_cols], sep = "_"))))
该方法同样适配任意数量的分组列,只需要修改group_cols的取值即可。
内容的提问来源于stack exchange,提问作者Cpo
相关产品推荐
相关产品推荐

