如何为data.table中的每个组生成唯一数字并统计?
基于data.table的三个需求实现方案
先给出原始数据供参考:
library(data.table) group <- c("a", "a", "a", "b", "b") start <- c(3, 5, 15, 22, 25) end <- c(9, 11, 20, 23, 30) dt <- data.table(group, start, end)
(i) 新增列存储每行start到end的所有数字
利用data.table支持列表列的特性,直接生成每行的整数序列:
dt[, numbers := lapply(seq_along(start), function(i) seq(start[i], end[i]))]
执行后numbers列的每个元素为对应行start到end的完整整数序列,比如第一行对应c(3,4,5,6,7,8,9)。
(ii) 按group分组添加组内唯一数字列
按分组聚合所有行的序列,去重后生成组级唯一数字列表并关联回原表:
dt[, unique_numbers_per_group := list(unique(unlist(Map(seq, start, end)))), by = group]
Map(seq, start, end)生成组内所有行的序列集合,经unlist展开、unique去重后,用list包裹为列表列,确保同组所有行共享同一组唯一数字序列。
(iii) 统计每组唯一数字的数量
基于(ii)的结果,直接计算组内唯一数字的总个数:
dt[, count_unique_numbers := length(unlist(unique_numbers_per_group)), by = group]
执行后同组所有行都会显示该组唯一数字的总数量,比如分组a的结果为15。
内容的提问来源于stack exchange,提问作者gernophil
相关产品推荐
相关产品推荐

