使用dplyr::distinct()时R报错:‘distinct_’无适用方法于数值型对象
解决dplyr分组统计唯一值数量的问题
嗨Peter,我来帮你梳理下问题并给出解决方案:
为什么会报错?
你遇到的报错核心原因是dplyr::distinct()的设计逻辑:它是专门为数据框设计的函数,不能直接传入单个向量(比如你提取的days_vec),也不能在summarise()里直接用——因为summarise()要求每组返回一个标量值,而distinct()返回的是数据框,类型不匹配,所以触发了no applicable method的错误。
正确的解决方案
要实现按id_1分组统计days的唯一值数量,最直接的方法是用dplyr内置的n_distinct()函数,它就是专门干这个活的:
library(dplyr) df.ex <- structure( list( id_1 = c(15796L, 15796L, 15799L, 15799L), id_2 = c(61350L, 351261L, 61488L, 315736L), days = c(30.5, 36.4854, 30.5, 30.5) ), row.names = c(NA,-4L), class = "data.frame", .Names = c("id_1", "id_2", "days") ) # 正确代码 result <- df.ex %>% group_by(id_1) %>% summarise(count_distinct_values = n_distinct(days)) result #> # A tibble: 2 × 2 #> id_1 count_distinct_values #> <int> <int> #> 1 15796 2 #> 2 15799 1
如果你一定要用distinct()来实现,也可以先分组提取唯一值,再统计行数:
result <- df.ex %>% group_by(id_1) %>% distinct(days) %>% # 保留每组的唯一days值 summarise(count_distinct_values = n()) # 统计每组的行数
补充说明
n_distinct()默认会忽略NA值,如果你的数据里有NA且需要把它算作一个唯一值,可以加参数na.rm = FALSE,比如n_distinct(days, na.rm = FALSE)。- 之前你尝试的
count(distinct(., days))之所以报错,是因为distinct(., days)返回的是数据框,count()又是用来统计数据框行数的函数,嵌套在summarise()里会导致类型不匹配,所以行不通。
内容的提问来源于stack exchange,提问作者pd441
相关产品推荐
相关产品推荐

