Использование any () против | в dplyr :: mutate - PullRequest
0 голосов
/ 09 мая 2018

Почему я должен использовать | против 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
     )

Что здесь происходит и почему я должен использовать один способ сравнения значений над другим?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Вы также можете использовать 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  
0 голосов
/ 09 мая 2018

Разница между ними заключается в том, как рассчитывается ответ:

  • для |, элементы сравниваются построчно, а логическая логика используется для возврата правильного значения. В приведенном выше примере каждая пара x и y сравнивается друг с другом, и для каждой пары возвращается логическое значение, что приводит к 12 различным ответам, по одному для каждой строки кадра данных.
  • any(), с другой стороны, просматривает весь вектор и возвращает одно значение. В вышеприведенном примере строка преобразования, которая вычисляет новый столбец usingany, в основном делает это: any(c(df$x, df$y)), который будет возвращать TRUE, поскольку в df$x или df$y есть хотя бы одно значение TRUE. Это единственное значение затем присваивается каждой строке фрейма данных.

Вы можете увидеть это в действии, используя другие столбцы в вашем фрейме данных:

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() вы обычно захотите использовать |.

...