如何在type分组内将row按n个唯一值分组生成grp变量
R实现按type分组、按n个唯一row划分grp的方法
可以用dplyr包完成需求,核心逻辑是先在type分组内校验唯一row的数量是否符合整除要求,再给符合条件的组分配分组编号:
library(dplyr) # 定义自定义函数,data为输入数据框,n为每组包含的唯一row数量 create_grp <- function(data, n) { data %>% group_by(type) %>% mutate( # 标记当前row是否是该type内的首次出现 is_unique = !duplicated(row), # 统计该type下唯一row的总数量 unique_count = sum(is_unique) ) %>% # 仅给首次出现的row分配临时组号 mutate(temp_grp = ifelse(is_unique, ceiling(cumsum(is_unique)/n), NA)) %>% # 不满足整除条件的type,grp全设为NA;满足条件的则填充组号 mutate(grp = ifelse(unique_count %% n != 0, NA, temp_grp)) %>% # 清理中间变量并取消分组 select(-is_unique, -unique_count, -temp_grp) %>% ungroup() } # 测试n=4的情况 dat_with_grp <- create_grp(dat0, n=4) # 查看结果 print(dat_with_grp)
代码说明
- 分组统计:按
type分组后,标记每个row的首次出现,并统计该组内唯一row的总数; - 临时组号分配:对首次出现的
row,用累计计数除以n后向上取整生成组号,非首次的row暂时留空; - 校验与填充:如果该
type的唯一row总数不能被n整除,整个组的grp设为NA;符合条件的则把临时组号填充到对应row的所有重复行; - 清理收尾:移除中间计算变量,取消分组,得到最终结果。
测试验证
- 当
n=4时,type a有8个唯一row,刚好分成2组;type b有12个唯一row,分成3组,所有对应行都会得到正确的grp值; - 当
n=5时,type a和type b的唯一row总数都不能被5整除,所有行的grp都会返回NA。
内容的提问来源于stack exchange,提问作者denis
相关产品推荐
相关产品推荐

