如何比较并统计R数据框多列中唯一值组合的出现次数?
统计数据框中指定列唯一值组合的出现次数
你需要统计数据框中col1、col2、col3三列的唯一值组合出现次数,生成包含计数列的新数据框。
示例数据
df <- data.frame( col1 = c(1,2,3,4,1,2,3,4,1), col2 = c(5,6,7,8,5,6,7,8,5), col3 = c(9,10,11,12,9,10,11,13,9))
目标结果
df2 <- data.frame( col1 = c(1,2,3,4,4), col2 = c(5,6,7,8,8), col3 = c(9,10,11,12,13), count = c(3,2,2,1,1))
原代码问题分析
你之前的代码存在两个核心问题:
- 先用
distinct()去重,直接丢失了重复组合的计数信息,后续统计的是去重后分组的数量,而非原数据中组合的真实出现次数。 - 仅按
col3分组,没有以三列的完整组合作为分组依据,无法准确统计目标组合的出现次数。
正确解决方法
方法1:使用dplyr(推荐)
直接按三列的组合分组,统计每组的行数即可:
library(dplyr) df2 <- df %>% group_by(col1, col2, col3) %>% summarize(count = n(), .groups = "drop")
group_by(col1, col2, col3):以三列的唯一组合作为分组依据summarize(count = n()):统计每组的行数,即对应组合的出现次数.groups = "drop":取消分组状态,返回普通数据框,避免后续操作受分组干扰
运行后结果与目标df2完全一致。
方法2:使用base R
如果不想加载dplyr包,可通过以下两种方式实现:
# 方式1:用aggregate函数 df2 <- aggregate(. ~ col1 + col2 + col3, data = df, FUN = length) names(df2)[4] <- "count" # 方式2:用table转换为数据框 tab <- table(df$col1, df$col2, df$col3) df2 <- as.data.frame(tab, responseName = "count") names(df2)[1:3] <- c("col1", "col2", "col3")
内容的提问来源于stack exchange,提问作者fishy_stats
相关产品推荐
相关产品推荐

