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

时间:2018-05-09 17:53:18

标签: r dplyr tidyverse

在比较|中的列时,为什么要使用any() vs 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
     )

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

3 个答案:

答案 0 :(得分:2)

两者之间的区别在于如何计算答案:

  • 对于|,元素按行进行比较,布尔逻辑用于返回正确的值。在上面的示例中,每个x和y对彼此进行比较,并为每对返回一个逻辑值,得到12个不同的答案,每个答案对应一行数据帧。
  • 另一方面,
  • any()查看整个向量并返回单个值。在上面的示例中,计算新usingany列的mutate行基本上是这样做的:any(c(df$x, df$y)),它将返回TRUE,因为其中至少有一个TRUEdf$xdf$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
    )

要在应该使用哪个时回答:如果要逐行比较元素,请使用|。如果想要关于整个数据框的通用答案,请使用any()

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

答案 1 :(得分:1)

您也可以使用rowwise()

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

 df %>%
     rowwise() %>%
     mutate(x_or_y = any(x,y))

输出:

# A tibble: 12 x 5  
    x     y     allF  allT  x_or_y  
    <lgl> <lgl> <lgl> <lgl> <lgl>   
  1 TRUE  TRUE  FALSE TRUE  TRUE   
  2 FALSE FALSE FALSE TRUE  FALSE  
  3 TRUE  TRUE  FALSE TRUE  TRUE   
  4 TRUE  FALSE FALSE TRUE  TRUE   
  5 FALSE TRUE  FALSE TRUE  TRUE   
  6 TRUE  FALSE FALSE TRUE  TRUE   
  7 TRUE  TRUE  FALSE TRUE  TRUE   
  8 FALSE FALSE FALSE TRUE  FALSE  
  9 TRUE  TRUE  FALSE TRUE  TRUE  
 10 TRUE  FALSE FALSE TRUE  TRUE  
 11 FALSE TRUE  FALSE TRUE  TRUE  
 12 TRUE  FALSE FALSE TRUE  TRUE  

答案 2 :(得分:-1)

您可以同时使用 OR 运算符 |any()

比较 &all() 是一回事。

按照建议,您必须考虑到 | 是矢量化的,而 any() 不是

为了以相同的方式使用 any(),您必须按行对数据进行分组,因此您可以调用等效的 any(current_row)。这可以通过 purrr::pmapdplyr::rowwise 完成:

请参阅下面的代码以比较所有方法:

df%>%mutate(row_OR=x|y,
            row_pmap_any=pmap_lgl(select(.,c(x,y)), any))%>%
        rowwise()%>%
        mutate(row_rowwise_any=any(c_across(c(x,y))))

# A tibble: 12 x 7
# Rowwise: 
   x     y     allF  allT  row_OR row_pmap_any row_rowwise_any
   <lgl> <lgl> <lgl> <lgl> <lgl>  <lgl>        <lgl>          
 1 TRUE  TRUE  FALSE TRUE  TRUE   TRUE         TRUE           
 2 FALSE FALSE FALSE TRUE  FALSE  FALSE        FALSE          
 3 TRUE  TRUE  FALSE TRUE  TRUE   TRUE         TRUE           
 4 TRUE  FALSE FALSE TRUE  TRUE   TRUE         TRUE           
 5 FALSE TRUE  FALSE TRUE  TRUE   TRUE         TRUE           
 6 TRUE  FALSE FALSE TRUE  TRUE   TRUE         TRUE           
 7 TRUE  TRUE  FALSE TRUE  TRUE   TRUE         TRUE           
 8 FALSE FALSE FALSE TRUE  FALSE  FALSE        FALSE          
 9 TRUE  TRUE  FALSE TRUE  TRUE   TRUE         TRUE           
10 TRUE  FALSE FALSE TRUE  TRUE   TRUE         TRUE           
11 FALSE TRUE  FALSE TRUE  TRUE   TRUE         TRUE           
12 TRUE  FALSE FALSE TRUE  TRUE   TRUE         TRUE 

所有方法都有效,我没有发现性能有太大差异。