[英]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>
失敗
dt[is.na(rowSums(dt))]
Error: 'x' must be numeric
因為它假定dt
的所有列都是數字。
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.