查找 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
的所有行。
有没有一种优雅的方式来显示 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 %>%
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
的所有行。