在R数据框中按规则将重复行标记为重复样本(replicates)
问题解决:为分组重复样本分配唯一编号
问题背景
现有一个包含1个连续变量列(cont.var)和2个因子列(fact1、fact2,取值为0或1)的数据框,需要按规则为重复行分配唯一的重复样本编号(rep)。
原始数据结构:
cont.var fact1 fact2 1 1.0 1 0 2 1.0 0 1 3 1.5 1 0 4 1.5 1 0 5 1.5 0 1 6 1.5 0 1
规则说明
- 若两行
cont.var值相同,但fact1和fact2的组合不同,需分配不同的重复样本编号 - 若两行
cont.var值相同,且fact1、fact2的组合也相同,需分配相同的重复样本编号
期望输出
cont.var fact1 fact2 rep 1 1.0 1 0 1 2 1.0 0 1 2 3 1.5 1 0 3 4 1.5 1 0 3 5 1.5 0 1 4 6 1.5 0 1 4
无效尝试代码
使用make.unique无法满足需求,会导致相同cont.var但不同因子组合的行得到重复编号:
library(dplyr) sample.df <- data.frame( cont.var = c(1,1,1.5,1.5,1.5,1.5,2,2,2,3), fact1 = c(1,0,1,1,0,0,1,1,0,1), fact2 = c(0,1,0,0,1,1,0,0,1,0) ) sample.df %>% group_by(cont.var, fact1, fact2) %>% mutate(replicate = make.unique(as.character(cont.var), "_"))
解决方案
核心思路:将cont.var、fact1、fact2的组合作为分组依据,为每个唯一组分配递增的整数编号,以下两种方法均可实现:
方法1:使用cur_group_id()(适用于dplyr 1.0.0及以上版本)
library(dplyr) sample.df <- data.frame( cont.var = c(1,1,1.5,1.5,1.5,1.5,2,2,2,3), fact1 = c(1,0,1,1,0,0,1,1,0,1), fact2 = c(0,1,0,0,1,1,0,0,1,0) ) sample.df <- sample.df %>% group_by(cont.var, fact1, fact2) %>% mutate(rep = cur_group_id()) %>% ungroup() print(sample.df)
方法2:使用group_indices()(兼容旧版dplyr)
sample.df <- sample.df %>% mutate(rep = group_indices(., cont.var, fact1, fact2))
两种方法都会为每个cont.var + fact1 + fact2的唯一组合分配连续整数编号,完全匹配需求:同一组合的行共享编号,不同组合(即使cont.var相同)获得不同编号。
验证输出
运行代码后,前6行输出与期望一致:
cont.var fact1 fact2 rep 1 1.0 1 0 1 2 1.0 0 1 2 3 1.5 1 0 3 4 1.5 1 0 3 5 1.5 0 1 4 6 1.5 0 1 4
内容的提问来源于stack exchange,提问作者sp29
相关产品推荐
相关产品推荐

