簡體   English   中英

查找 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的行”。 這已得到糾正。

我在相關問題中找到了答案:

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

為了完整起見,這里是一個最小的、可重現的示例,其中只有第 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>

clemenskuehn 的回答

失敗

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的所有行。

計算 df object 和dplyr package 的每一列中的 NA

 df %>%
      summarise_all(funs(sum(is.na(.))))

這將顯示 data.table 的所有包含 NA 的行:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM