如何用dplyr的if_all/if_any筛选指定列无缺失值的行?
用dplyr的if_all函数筛选指定列无缺失值的行
你之前的写法出错是因为直接传递!is.na给if_all的函数参数不合法——!is.na不是可直接调用的函数对象(!是运算符,单独这样写会因缺少参数报错)。正确写法需要用lambda表达式(以~开头,.x代表当前列的元素)包装判断逻辑:
正确代码
data <- data.frame(a= c(1, NA, 3), b = c(2, 4, NA), c=c(NA, 1, 2)) # 筛选a、b列均无缺失值的行 data %>% filter(if_all(c(a, b), ~ !is.na(.x)))
结果说明
执行后会返回仅第一行的结果,和你原代码filter(!is.na(a) & !is.na(b))效果完全一致。if_all(c(a, b), ~ !is.na(.x))的逻辑是:对a和b每一列检查所有元素是否都不为NA,只有当两列的检查结果均为TRUE时,对应行才会被保留。
另外也可以用complete.cases作为函数参数,写法更简洁:
data %>% filter(if_all(c(a, b), complete.cases))
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

