查找 R data.table 中的所有 NA

Find all NAs in R data.table

有没有一种优雅的方式来显示 R data.table 中至少有一个 NA 的所有行?我会提出以下建议:

nas <- dt[is.na(dt)]

但这会导致错误:

Error in `[.data.table`(dt, is.na(dt)) : 
  i is invalid type (matrix). Perhaps in future a 2 column matrix could return a list of elements of DT (in the spirit of A[B] in FAQ 2.14). Please report to data.table issue tracker if you'd like this, or add your comments to FR #657.

以下工作,但可能会有所改进:

nas <- rbindlist(lapply(names(dt), function(col){
  dt[is.na(get(col))]
}))

编辑:原始问题的措辞不正确“...在 R data.table 中显示所有带有 NA 的行”。这已得到纠正。

使用 dplyr

计算 df 对象每一列中的 NA
 df %>%
      summarise_all(funs(sum(is.na(.))))

我在相关个问题中找到了答案:

nas <- dt[!complete.cases(dt)]

这会显示 data.table 中包含 NA 的所有行:

dt[is.na(rowSums(dt))]

为了完整起见,这是一个 Minimal, Reproducible Example,其中只有第 6 行 完整 ,即没有任何 NA 并且列是不同类型:

library(data.table)
options(datatable.print.class = TRUE)
n <- 7
dt <- data.table(1:n,  pi * as.numeric(1:n), 
                 letters[1:n], rep(c(TRUE, FALSE), length.out = n),
                 factor(LETTERS[1:n]))

for (i in 1:ncol(dt)) set(dt, i, i, NA)
for (i in 1:ncol(dt)) set(dt, nrow(dt), i, NA)                 
dt
      V1        V2     V3     V4     V5
   <int>     <num> <char> <lgcl> <fctr>
1:    NA  3.141593      a   TRUE      A
2:     2        NA      b  FALSE      B
3:     3  9.424778   <NA>   TRUE      C
4:     4 12.566371      d     NA      D
5:     5 15.707963      e   TRUE   <NA>
6:     6 18.849556      f  FALSE      F
7:    NA        NA   <NA>     NA   <NA>

按预期工作:

dt[!complete.cases(dt)]
      V1        V2     V3     V4     V5
   <int>     <num> <char> <lgcl> <fctr>
1:    NA  3.141593      a   TRUE      A
2:     2        NA      b  FALSE      B
3:     3  9.424778   <NA>   TRUE      C
4:     4 12.566371      d     NA      D
5:     5 15.707963      e   TRUE   <NA>
6:    NA        NA   <NA>     NA   <NA>

失败

dt[is.na(rowSums(dt))]
Error: 'x' must be numeric

因为它假设 dt 所有 列都是数字。

计算每行中的 NA

dt[rowSums(is.na(dt)) > 0]
      V1        V2     V3     V4     V5
   <int>     <num> <char> <lgcl> <fctr>
1:    NA  3.141593      a   TRUE      A
2:     2        NA      b  FALSE      B
3:     3  9.424778   <NA>   TRUE      C
4:     4 12.566371      d     NA      D
5:     5 15.707963      e   TRUE   <NA>
6:    NA        NA   <NA>     NA   <NA>

这将显示至少找到一个 NA 的所有行。