我想在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)
如果你想避免强制转换为矩阵,你可以使用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)
返回相同的东西.