使用 any() 与 | 在 dplyr::mutate 中

cra*_*lly 7 r dplyr tidyverse

当我比较 中的列时,为什么要使用|vs ?any()dplyr::mutate()

为什么他们返回不同的答案?

例如:

library(tidyverse)
df  <- data_frame(x = rep(c(T,F,T), 4), y = rep(c(T,F,T, F), 3), allF  = F, allT = T)

 df %>%
     mutate( 
          withpipe = x | y # returns expected results by row
        , usingany = any(c(x,y)) # returns TRUE for every row
     )
Run Code Online (Sandbox Code Playgroud)

这里发生了什么,为什么我应该使用一种方法来比较另一种值?

cra*_*lly 5

两者的区别在于答案的计算方式:

  • for |,元素按行比较,布尔逻辑用于返回正确的值。在上面的示例中,每个 x 和 y 对相互进行比较,并为每对返回一个逻辑值,从而产生 12 个不同的答案,数据帧的每一行一个。
  • any(),另一方面,查看整个向量并返回单个值。在上面的例子中,计算新usingany列的 mutate 行基本上是这样做的:any(c(df$x, df$y)),它将返回,TRUE因为TRUEdf$x或中至少有一个值df$y。然后将该单个值分配给数据帧的每一行。

您可以使用数据框中的其他列看到这一点:

df %>% 
    mutate(
        usingany = any(c(x,y)) # returns all TRUE
      , allfany  = any(allF)   # returns all FALSE because every value in df$allF is FALSE
    )
Run Code Online (Sandbox Code Playgroud)

回答何时应该使用 which:|当您想按行比较元素时使用。any()当您想要关于整个数据框的通用答案时使用。

TLDR,在使用时dplyr::mutate(),您通常会想要使用|.