在dplyr::mutate中使用any()与|的差异及选型建议
在dplyr::mutate()中|运算符与any()的差异解析
先看你给出的代码例子,确实会出现withpipe按行返回正确结果,而usingany全为TRUE的情况,这背后是两者的运算逻辑本质不同:
1. 差异的核心原因
|是向量化的逐元素运算符:它会对x和y这两个等长向量进行按位置配对比较,也就是每一行的x值和对应行的y值做逻辑或运算,所以每一行的结果只和当前行的两个值有关,完全符合你按行判断的预期。any()是全局向量判断函数:当你写any(c(x,y))时,c(x,y)会把整个x列和y列合并成一个长度为24的大向量(原df有12行,x和y各12个元素),any()的作用是检查这个大向量里是否存在至少一个TRUE。显然你的数据里有大量TRUE,所以any()会返回一个单个的TRUE值,然后dplyr会把这个单个值"广播"到每一行,导致所有行的usingany都是TRUE。
2. 如何选择合适的比较方式
根据你的需求场景来选:
- 如果需要按行判断多个列中是否有至少一个TRUE(也就是逐行的逻辑或):
- 直接用向量化运算符
|(适合列数少的情况,比如2-3列):x | y | z - 用dplyr专门的行级判断函数
if_any()(适合列数多或者用列选择器的情况):比如if_any(c(x,y)),或者if_any(starts_with("col_")) - 也可以用
rowwise()配合any(),但效率不如前两种:df %>% rowwise() %>% mutate(usingany_rowwise = any(c(x,y))) %>% ungroup()
- 直接用向量化运算符
- 如果需要判断整个列集合中是否存在至少一个TRUE(全局判断):直接用
any(),但这种场景在mutate里很少见,更多用于数据校验。
举个用if_any()的例子,替换你代码里的usingany:
library(tidyverse) df <- tibble(x = rep(c(T,F,T), 4), y = rep(c(T,F,T, F), 3), allF = F, allT = T) df %>% mutate( withpipe = x | y, using_ifany = if_any(c(x,y)) )
这样using_ifany就会和withpipe得到完全一样的结果。
内容的提问来源于stack exchange,提问作者crazybilly
相关产品推荐
相关产品推荐

