在tidyverse中按行等效apply()?

Kev*_*rca 6 r dplyr tidyverse

我想在data.frame中插入一个新列,当行中至少有一个缺失值时,该值为TRUE,否则为FALSE.

对于这个问题,apply是一个完美的用例:

编辑 - 添加了示例

tab <- data.frame(a = 1:10, b = c(NA, letters[2:10]), c = c(LETTERS[1:9], NA))

tab$missing <- apply(tab, 1, function(x) any(is.na(x)))
Run Code Online (Sandbox Code Playgroud)

但是,我加载了严格的包,并得到了这个错误:apply() coerces X to a matrix so is dangerous to use with data frames.Please use lapply() instead.

我知道我可以安全地忽略这个错误,但是,我想知道是否有一种方法可以使用其中一个tidyverse包以简单的方式对其进行编码.我尝试使用dplyr失败了:

tab %>% 
  rowwise() %>% 
  mutate(missing = any(is.na(.), na.rm = TRUE))
Run Code Online (Sandbox Code Playgroud)

ali*_*ire 6

如果你想避免强制转换为矩阵,你可以使用purrr::pmap它,并行地遍历列表的元素并将它们传递给函数:

library(tidyverse)

tab <- data_frame(a = 1:10, 
                  b = c(NA, letters[2:10]), 
                  c = c(LETTERS[1:9], NA))

tab %>% mutate(missing = pmap_lgl(., ~any(is.na(c(...)))))
#> # A tibble: 10 x 4
#>        a     b     c missing
#>    <int> <chr> <chr>   <lgl>
#>  1     1  <NA>     A    TRUE
#>  2     2     b     B   FALSE
#>  3     3     c     C   FALSE
#>  4     4     d     D   FALSE
#>  5     5     e     E   FALSE
#>  6     6     f     F   FALSE
#>  7     7     g     G   FALSE
#>  8     8     h     H   FALSE
#>  9     9     i     I   FALSE
#> 10    10     j  <NA>    TRUE
Run Code Online (Sandbox Code Playgroud)

在函数中,c有必要将传递给函数的所有参数拉...入向量,这可以传递给is.na和折叠any.所述*_lgl后缀的pmap简化了结果为布尔矢量.

请注意,虽然这避免了对矩阵的强制,但它不一定比方法更快,因为矩阵运算在R中高度优化.明确强制转换为矩阵可能更有意义,例如

tab %>% mutate(missing = rowSums(is.na(as.matrix(.))) > 0)
Run Code Online (Sandbox Code Playgroud)

返回相同的东西.