逐行查找所有列中的 NA 数量,并将数字分配给新变量
Finding number of NAs across all columns, row by row, and assigning number to new variable
所以我有一个包含多列和多行的数据框。我希望能够将所有列中的 NA 数逐行分配给一个新变量 (NACount)。像这样:
Col1 Col2 Col3 Col4 NACount
A A B NA 1
B B NA NA 2
我构建了一个循环来执行此操作,但我的数据集很大,所以循环需要永远!这是我的代码:
for(i in 1:nrow(dat)){
temp = which(!is.na(dat[i,]))
dat$NACount[[i]] = length(temp)
}
请帮我找到一个更容易 approach/way 的方法!
非常感谢!
使用rowSums
:
dat[["NACount"]] <- rowSums(is.na(dat))
这比 apply
:
快得多
microbenchmark::microbenchmark(
rowSums = rowSums(is.na(dat)),
apply = apply(dat, 1, function(x) sum(is.na(x)))
)
输出:
Unit: microseconds
expr min lq mean median uq max neval cld
rowSums 78.033 88.4245 112.5160 106.839 116.1365 439.751 100 a
apply 632.643 657.8040 768.2667 674.395 725.2615 6124.064 100 b
所以我有一个包含多列和多行的数据框。我希望能够将所有列中的 NA 数逐行分配给一个新变量 (NACount)。像这样:
Col1 Col2 Col3 Col4 NACount
A A B NA 1
B B NA NA 2
我构建了一个循环来执行此操作,但我的数据集很大,所以循环需要永远!这是我的代码:
for(i in 1:nrow(dat)){
temp = which(!is.na(dat[i,]))
dat$NACount[[i]] = length(temp)
}
请帮我找到一个更容易 approach/way 的方法!
非常感谢!
使用rowSums
:
dat[["NACount"]] <- rowSums(is.na(dat))
这比 apply
:
microbenchmark::microbenchmark(
rowSums = rowSums(is.na(dat)),
apply = apply(dat, 1, function(x) sum(is.na(x)))
)
输出:
Unit: microseconds
expr min lq mean median uq max neval cld
rowSums 78.033 88.4245 112.5160 106.839 116.1365 439.751 100 a
apply 632.643 657.8040 768.2667 674.395 725.2615 6124.064 100 b