如何跨多个DataFrame为相同分组变量分配统一唯一ID
解决不同DataFrame中相同a、b组合对应统一ID的问题
问题根源
cur_group_id() 是基于单个DataFrame内部的分组出现顺序生成编号的,两个DataFrame中相同a、b组合的分组顺序可能不同,导致生成的ID不一致。另外如果你的分组包含了z,同一个a、b下不同的z会被拆分为不同分组,也会破坏ID的统一性(如果你的需求是仅按a、b统一ID的话)。
解决方法
方法1:合并后统一生成ID再拆分
这种方法最直观,通过合并两个DataFrame确保分组顺序一致,生成ID后再拆分回原数据集:
library(dplyr) # 模拟你的数据(替换成实际数据即可) df1 <- tibble(a = c("x", "x", "y"), b = c("m", "n", "m"), z = c(1,2,3), year = 2012) df2 <- tibble(a = c("y", "x", "x"), b = c("m", "n", "m"), z = c(4,5,6), year = 2013) # 合并数据集,按a、b分组生成统一ID combined <- bind_rows(df1, df2) %>% group_by(a, b) %>% # 仅按a、b分组,去掉z(如果不需要按z区分ID) mutate(group_id = cur_group_id()) %>% ungroup() # 拆分回原DataFrame df1_final <- combined %>% filter(year == 2012) df2_final <- combined %>% filter(year == 2013)
方法2:创建映射表关联ID
如果数据量较大,不想合并整个数据集,可以先提取所有唯一的a、b组合生成映射表,再分别关联到两个DataFrame:
# 生成a、b到ID的映射表 id_map <- bind_rows(df1 %>% select(a, b), df2 %>% select(a, b)) %>% distinct(a, b) %>% mutate(group_id = row_number()) # 关联映射表到原数据集 df1_final <- df1 %>% left_join(id_map, by = c("a", "b")) df2_final <- df2 %>% left_join(id_map, by = c("a", "b"))
注意事项
- 如果你的需求是必须包含z在分组内,但仍希望相同a、b的分组有统一的基础ID,可以在生成ID时先按a、b生成主ID,再按z生成子ID,比如
group_id = paste(cur_group_id(a,b), cur_group_id(z), sep = "_"),但这和你原本的需求可能不符,需根据实际场景调整。
内容的提问来源于stack exchange,提问作者anrisakaki96
相关产品推荐
相关产品推荐

