统计n值遇错误:使用dplyr筛选18-30岁参与者求和报错求助
解决dplyr管道中
sum(n)触发的类型错误问题 这个错误的核心原因是你在管道末尾直接使用sum(n)的方式不符合dplyr的语法逻辑:管道会把前一步返回的整个tibble数据框作为第一个参数传递给sum函数,但sum并不认识n这个参数——它期望的是一个可求和的向量,这就导致了类型转换失败的错误。
下面提供几种可行的解决方案,从符合dplyr风格到更简洁的base R实现都有:
方案1:用dplyr的summarize完成求和(保持管道风格)
如果你想继续沿用group-by-count的流程,只需要把最后一步的sum(n)替换成summarize(total = sum(n)),这样dplyr会正确识别数据框中的n列并计算总和:
patientage <- c(18, 18, 18, 18, 18, 19, 20, 20, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 34) patientage %>% as_tibble(colnames = "patientage") %>% # 转为tibble并指定列名,避免默认的`value` group_by(patientage) %>% count() %>% filter(patientage > 17 & patientage < 31) %>% summarize(total_participants = sum(n))
运行后会返回一个包含total_participants的tibble,结果为21(正好是18-30岁的参与者总数)。
方案2:简化流程,直接筛选后统计数量
其实你不需要先分组计数再求和,直接筛选出符合年龄范围的元素后统计数量更高效:
# 用dplyr的keep函数实现 patientage %>% keep(. > 17 & . < 31) %>% length() # 或者用base R的逻辑向量求和(最简洁) sum(patientage > 17 & patientage < 31)
这两种方法都会直接返回数字21,逻辑向量求和的原理是:TRUE会被当作1,FALSE当作0,求和就等于统计符合条件的元素个数。
为什么原代码会报错?
再拆解一下原代码的执行流程:
group_by(patientage):把向量转为分组的tibble%>% count(patientage):生成包含patientage和n(每组人数)的tibble%>% filter(patientage >17 & patientage <31):筛选出18-30岁的分组,返回一个有21行的tibble%>% sum(n):管道把这个tibble传给sum,相当于执行sum(your_tibble, n),但sum的第二个参数是na.rm,这里的n被当成了na.rm的参数,但n是一个列名而非逻辑值,所以触发了类型错误。
内容的提问来源于stack exchange,提问作者Amphetamim
相关产品推荐
相关产品推荐

