R语言过滤数据框后计算均值报错:Argument is not numeric or logical: returning NA
解决dplyr筛选后计算均值的报错问题
我一眼就看出问题所在啦——你的代码没有正确利用管道符传递的筛选后数据集,反而还是在调用原始数据框的pci列,而且mean函数接收的是整个数据框(不是数值向量),这才导致了那个报错。
正确的写法有两种,任选其一即可:
方法1:用dplyr的summarize(推荐,更符合tidyverse风格)
country_hsproduct4digit_year %>% filter(hs_product_code == "3510") %>% summarize(mean_pci = mean(pci, na.rm = TRUE))
这个写法会先筛选出产品代码为"3510"的行,然后对这些行的pci列计算均值,最终返回一个包含均值结果的数据框。
方法2:先提取pci列再计算均值
如果你只想得到一个单独的数值结果,可以用pull提取列向量后再传给mean:
country_hsproduct4digit_year %>% filter(hs_product_code == "3510") %>% pull(pci) %>% mean(na.rm = TRUE)
pull(pci)会把筛选后的pci列转换成数值向量,这时候mean就能正常处理啦。
为什么你的原代码会报错?
原代码里,filter之后通过管道符传递的是筛选后的整个数据框,但你在mean里写的是country_hsproduct4digit_year$pci——这相当于完全忽略了筛选的结果,直接计算原始数据的pci均值。而且管道符会把筛选后的数据框作为第一个参数传给mean,变成mean(筛选后的数据框, country_hsproduct4digit_year$pci, na.rm=TRUE),mean的第一个参数是数据框(不是数值/逻辑向量),自然就会抛出“Argument is not numeric or logical: returning NA”的错误。
另外你提到已经确认hs_product_code是字符型,这部分没问题,筛选条件的"3510"和变量类型匹配,不用调整。
内容的提问来源于stack exchange,提问作者fabian_alex
相关产品推荐
相关产品推荐

