R中如何使用dplyr的group_by语句按多列统计唯一行数
代码修正方案
报错触发根源
- 管道符书写错误:
% > %在符号之间加了空格,R 会将其识别为独立的语法单元,而非完整的管道运算符%>%,直接触发“找不到对应函数”的报错。正确的管道符无任何内部空格。 - 分组列引用冗余:
group_by()中传入的列名不需要加ds$前缀。管道传入的数据框会作为函数的默认执行上下文,手动加ds$会直接抓取全局环境中完整数据框的列,破坏分组作用域,导致分组逻辑失效。
原代码的逻辑偏差
修正管道符和列引用后,原写法sum(!duplicated(ds))依然无法得到正确结果:duplicated(ds) 是对整个数据集做全局重复判断,不会跟随分组上下文执行,输出的重复标记对所有分组完全一致,统计结果不具备参考性。
可直接运行的正确代码
根据按三列分组统计组内唯一行数的需求,可根据实际场景选择对应实现:
- 场景1:统计每个分组的总记录数
代码返回每个(age, occupation, workclass)组合对应的所有记录总数,是最常用的分组统计逻辑。library(dplyr) ds <- read.csv("env12k10.csv") result <- ds %>% group_by(age, occupation, workclass) %>% summarise( row_total = n(), .groups = "drop" ) - 场景2:统计组内剔除完全重复行后的唯一记录数
如果需要剔除分组内完全重复的整行后再计数,可搭配distinct()实现:result <- ds %>% group_by(age, occupation, workclass) %>% distinct() %>% summarise( unique_row = n(), .groups = "drop" )
补充提示:此前从技术帖看到的sum(!duplicated())写法,要在分组场景生效,需要显式获取分组内的当前数据,写法为summarise(unique_count = sum(!duplicated(cur_data_all()))),但这种写法可读性差,新手优先推荐distinct()方案。
内容的提问来源于stack exchange,提问作者T R
相关产品推荐
相关产品推荐

