使用dplyr按行判断子集列是否全为NA时遇c_across报错问题
解决c_across()报错的方案
你遇到的错误核心是:c_across() 需要在dplyr的向量化动词上下文里使用,直接嵌套在base R的all()中时,dplyr无法正确识别它的调用环境。下面提供两种可行的解决方式:
推荐写法(无需rowwise,效率更高)
用dplyr专门的if_all()函数,直接判断指定列的每行是否全部满足is.na条件,这个方法是向量化操作,比逐行循环的rowwise()效率高很多:
d %>% mutate(anyEntries = if_all(v1:v3, is.na))
若坚持使用rowwise()+c_across()的写法
如果一定要保留rowwise()的逻辑,首先确保你的dplyr是最新版本(旧版本对c_across()的上下文支持存在缺陷),然后直接运行你写的代码即可:
d %>% rowwise() %>% mutate(anyEntries = all(is.na(c_across(v1:v3))))
更新版本后,dplyr能正确识别c_across()在rowwise()+mutate()中的上下文,报错会消失。
你提到逻辑在简单向量上正常,是因为base R函数不需要依赖dplyr的上下文规则,但在tidyverse的管道流中,必须遵循dplyr的函数调用规范。
内容的提问来源于stack exchange,提问作者llewmills
相关产品推荐
相关产品推荐

