如何从非因子列Key.1和Key.2生成递增Group列?
嘿,我懂你想要更简洁直观的方式生成这个Group列——你之前的方法确实有点繁琐,这里有几个更清爽的方案,完全贴合你的需求:基于Key.1和Key.2的唯一组合生成沿数据框向下递增的连续Group值,而且每个方案都一眼能看懂逻辑。
方案1:用dplyr的group_indices()(tidyverse党首选)
如果你平时用tidyverse工具链,dplyr里的group_indices()就是专门干这个事的,代码极简,逻辑清晰:
library(dplyr) Data <- Data %>% mutate(Group = group_indices(., Key.1, Key.2))
它会根据Key.1和Key.2的唯一组合,生成从1开始的连续整数,顺序严格遵循这些组合在数据框中首次出现的顺序,完美匹配你要的“沿表递增”要求,而且重复的组合会自动对应同一个Group值(比如你最后两行的重复组合,会正确匹配之前的Group 3和1)。
方案2:基础R一行搞定(无需额外包)
如果不想加载第三方库,用基础R也能实现,只需要把组合转成因子再转整数:
Data$Group <- as.integer(factor(paste(Data$Key.1, Data$Key.2), levels = unique(paste(Data$Key.1, Data$Key.2))))
这里的关键是用unique()指定因子的层级顺序——这样因子会按照组合在数据框中首次出现的顺序来排列,转成整数后就是你要的递增Group值,完全不需要手动修改因子层级。
方案3:data.table高效版(大数据场景首选)
如果你的数据集很大,data.table的方法会快很多,代码同样简洁:
library(data.table) setDT(Data)[, Group := .GRP, by = .(Key.1, Key.2)]
.GRP是data.table的内置变量,会自动给by指定的每个唯一分组分配一个连续递增的索引,顺序同样是分组首次出现的顺序,处理百万级数据也毫无压力。
这三个方案都能完美实现你的需求,而且比你之前的方法直观太多,选一个符合你平时工作流的就行~
内容的提问来源于stack exchange,提问作者Taylor Raine
相关产品推荐
相关产品推荐

