基于多列(子)分组统计单列唯一字符元素数量(附R示例数据集)
按多个分组列统计目标列唯一元素数量的实现方案
嘿,我来帮你搞定按多个分组列统计目标列唯一元素数量的需求!针对你给出的示例数据集,我准备了两种R里最常用的实现方案,分别是tidyverse系列的dplyr(语法清晰易读)和适合大数据的data.table(运算效率拉满)。
首先先补全你给出的示例数据集,添加一个Target列作为统计的目标列,方便演示:
# 补全后的示例数据集 test_data <- structure( list( ID = structure(c(4L, 4L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L), .Label = c("P39190", "U93491", "X28348", "Z93930"), class = "factor"), Sex = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L), .Label = c("F", "M"), class = "factor"), Target = c("A", "B", "A", "C", "B", "A", "X", "Y", "X", "Z", "Y", "X", "A", "D", "B", "A", "D", "C", "B", "X", "Y", "Z", "Y", "P", "Q", "P", "R", "Q", "S", "P", "R", "S", "Q", "R", "T", "T") ), class = "data.frame" )
方法1:使用dplyr包(tidyverse风格)
这是日常场景中最常用的语法,代码可读性极强,适合快速实现需求:
- 先安装并加载
dplyr包:
# 若未安装则执行安装 install.packages("dplyr") # 加载包 library(dplyr)
- 分组统计唯一值数量:
result_dplyr <- test_data %>% group_by(ID, Sex) %>% # 指定*多个分组列*,这里是ID和Sex,可按需增减列数 summarise( unique_target_count = n_distinct(Target), # 统计目标列的唯一元素数量 .groups = "drop" # 取消分组状态,返回普通数据框格式 ) # 查看结果 print(result_dplyr)
方法2:使用data.table包(高效处理大数据)
如果你的数据集规模较大,data.table的运算速度会比dplyr快很多,适合批量处理海量数据:
- 安装并加载
data.table包:
# 若未安装则执行安装 install.packages("data.table") # 加载包 library(data.table)
- 转换为data.table格式并分组统计:
# 将普通数据框转换为data.table格式 dt <- as.data.table(test_data) # 分组计算唯一值数量 result_dt <- dt[, .(unique_target_count = uniqueN(Target)), by = .(ID, Sex)] # 查看结果 print(result_dt)
通用调整说明
- 把代码里的
Target替换成你实际需要统计的目标列名即可; - 分组列可以根据需求灵活调整,比如只按
ID分组,或者添加更多列,只需在group_by()(dplyr)或by = .()(data.table)里列出对应的列名。
内容的提问来源于stack exchange,提问作者nahijafog
相关产品推荐
相关产品推荐

