如何为同一天内重复的ID添加带序号的SampleID列
如何为同一天内重复的ID添加带序号的SampleID列
看起来你需要给每个「同一天内同一母本(ID)的不同采集样本」分配唯一的SampleID,格式是ID-序号,序号代表该母本在当天的第几个采集样本对吧?你的思路方向是对的,但case_when的写法不太适合这种需要自动编号的场景,咱们换个更简洁的方式解决:
解决方案代码
首先确保你加载了dplyr包,然后用分组+组内编号的方式生成SampleID:
library(dplyr) # 先还原你的示例数据 d1 <- as.Date('2021-06-07') d2 <- as.Date('2021-06-08') d3 <- as.Date('2021-06-09') df <- data.frame( Days = c(1,1,2,2,2,2,3,3,3,3,3), ID = c(2,5,2,2,5,9,2,2,5,5,9), Collected = c(d1,d1,d2,d1,d1,d2,d1,d2,d1,d3,d2), Count = c(3,5,4,1,7,2,8,5,7,2,2) # 补上你示例里的Count列 ) # 生成SampleID df <- df %>% group_by(Days, ID) %>% # 按「天数+母本ID」分组 mutate(SampleID = paste(ID, row_number(), sep = "-")) %>% # 组内按行出现顺序生成序号,拼接成ID-序号 ungroup() # 取消分组,回到普通数据框 # 查看结果 print(df)
代码解释
group_by(Days, ID):把数据按「天数」和「母本ID」分成小组,这样我们只需要在每个小组内给不同的采集样本编号。row_number():在每个分组里,会给每一行分配一个从1开始的连续序号——正好对应你需要的“第1个样本、第2个样本”的编号。paste(ID, row_number(), sep = "-"):把母本ID和组内序号用连字符拼接,得到你想要的SampleID格式。
可选调整:按采集日期排序编号
如果你的序号需要按Collected日期的顺序(比如最早的采集日期对应-1),只需要在分组后先按Collected排序,再生成序号:
df <- df %>% group_by(Days, ID) %>% arrange(Collected) %>% # 先按采集日期升序排序 mutate(SampleID = paste(ID, row_number(), sep = "-")) %>% ungroup()
这样调整后,Days=2、ID=2的两行里,采集日期更早的d1会对应2-1,d2对应2-2,你可以根据实际需求选择~
备注:内容来源于stack exchange,提问作者kirchoffs
相关产品推荐
相关产品推荐

