You need to enable JavaScript to run this app. R中如何使用dplyr的group_by语句按多列统计唯一行数
优惠活动
大模型
产品
解决方案
定价
更多

R中如何使用dplyr的group_by语句按多列统计唯一行数

代码修正方案

报错触发根源

  • 管道符书写错误:% > %在符号之间加了空格,R 会将其识别为独立的语法单元,而非完整的管道运算符%>%,直接触发“找不到对应函数”的报错。正确的管道符无任何内部空格。
  • 分组列引用冗余:group_by() 中传入的列名不需要加ds$前缀。管道传入的数据框会作为函数的默认执行上下文,手动加ds$会直接抓取全局环境中完整数据框的列,破坏分组作用域,导致分组逻辑失效。

原代码的逻辑偏差

修正管道符和列引用后,原写法sum(!duplicated(ds))依然无法得到正确结果:
duplicated(ds) 是对整个数据集做全局重复判断,不会跟随分组上下文执行,输出的重复标记对所有分组完全一致,统计结果不具备参考性。

可直接运行的正确代码

根据按三列分组统计组内唯一行数的需求,可根据实际场景选择对应实现:

  • 场景1:统计每个分组的总记录数
    library(dplyr)
    ds <- read.csv("env12k10.csv")
    
    result <- ds %>%
      group_by(age, occupation, workclass) %>%
      summarise(
        row_total = n(),
        .groups = "drop"
      )
    
    代码返回每个(age, occupation, workclass)组合对应的所有记录总数,是最常用的分组统计逻辑。
  • 场景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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.06 04:27:03