R语言自定义函数计算观测值缺失值数量报错求助
解决方法
问题出在:你调用NMISSfunc(data,'x1':'x4')时,R会先按原生语法解析'x1':'x4',但字符串没法用:生成范围,结果得到NA,传给select就报错了。而直接在select里写'x1':'x4'是dplyr自己解析的语法,和原生R规则不一样。
下面给两种简洁的解决办法:
方法一:用tidy eval捕获列选择(推荐)
修改函数,用{{ }}(双大括号)捕获列选择参数,让dplyr能识别x1:x4这类范围语法,调用时直接传裸列名就行:
library(dplyr) data <- data.frame(x1 = c(NA, 1, 5, 1), x2 = c(7, 1, 1, 5), x3 = c(9, NA, 4, 9), x4 = c(3, 4, 1, 2)) NMISSfunc <- function(dataFrame, variables) { dataFrame %>% select({{ variables }}) %>% rowSums(is.na(.)) # 用rowSums替代apply,效率更高 } # 调用时直接传列范围,不用加引号 data$NMISS2 <- NMISSfunc(data, x1:x4)
方法二:支持字符串范围传入
如果习惯用字符串形式指定范围,可以让函数直接处理dplyr的字符串范围语法,只需要把参数用括号包起来,让dplyr解析而不是原生R:
NMISSfunc <- function(dataFrame, variables) { dataFrame %>% select({{ variables }}) %>% rowSums(is.na(.)) } # 调用时把字符串范围放在括号里 data$NMISS2 <- NMISSfunc(data, ('x1':'x4'))
额外提示
rowSums(is.na(.))比apply(1, function(x) sum(is.na(x)))的执行效率高很多,尤其是处理大数据集时,向量化操作的优势会很明显。
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

