R语言n_distinct(mtcars,cyl)报错咨询:为何与mpg示例表现不同?
问题原因及解决方案
你遇到的问题核心是混淆了dplyr包中distinct()和n_distinct()两个函数的参数逻辑,它们的用法差异很大:
distinct()是数据框操作函数,它的第一个参数是数据框,后续参数是要去重的列名(支持非标准求值,直接写列名即可),所以distinct(mtcars, mpg)或distinct(mtcars, cyl)都能正常工作,返回对应列的唯一值集合。而
n_distinct()是向量统计函数,它接受的参数是一个或多个向量,而非“数据框+列名”的组合。你之前写的n_distinct(mtcars, mpg)能返回32,其实是个巧合:- 当你把
mtcars(整个数据框)传入n_distinct()时,它会把数据框的每一列都当作一个向量,计算所有列组合后的唯一值数量——而mtcars的32行都是唯一的,所以结果是32。 - 此时你额外加的
mpg参数,如果刚好你之前在环境中定义过mpg <- mtcars$mpg(比如误操作或之前的代码残留),那它只是重复加入了mpg向量,组合后的唯一值数量还是32;如果没定义过,其实这行代码应该会报错,但可能你之前的环境残留变量导致了巧合运行。
- 当你把
而n_distinct(mtcars, cyl)报错,是因为你没有在环境中单独定义cyl向量,函数找不到这个对象,自然会抛出错误。
正确的用法
要统计某一列的唯一值数量,你有几种可选方式:
- 直接传入该列的向量:
n_distinct(mtcars$cyl)
- 结合
dplyr的管道语法(更符合tidyverse风格):
library(dplyr) mtcars %>% pull(cyl) %>% n_distinct()
- 在
dplyr的summarise()中使用(适合在数据框操作流程中统计):
mtcars %>% summarise(unique_cyl = n_distinct(cyl))
这三种方式都会正确返回cyl列的唯一值数量:3。
内容的提问来源于stack exchange,提问作者stackinator
相关产品推荐
相关产品推荐

