【发布时间】:2016-02-10 03:51:45
【问题描述】:
我正在尝试计算每行不包含 NA 的列数,并将该值放入该行的新列中。
示例数据:
library(data.table)
a = c(1,2,3,4,NA)
b = c(6,NA,8,9,10)
c = c(11,12,NA,14,15)
d = data.table(a,b,c)
> d
a b c
1: 1 6 11
2: 2 NA 12
3: 3 8 NA
4: 4 9 14
5: NA 10 15
我想要的输出将包括一个新列 num_obs,其中包含每行非 NA 条目的数量:
a b c num_obs
1: 1 6 11 3
2: 2 NA 12 2
3: 3 8 NA 2
4: 4 9 14 3
5: NA 10 15 2
我已经阅读了几个小时,到目前为止,我想出的最好的方法是循环遍历行,我知道这在 R 或 data.table 中是不可取的。我确信有更好的方法可以做到这一点,请赐教。
我的蹩脚方式:
len = (1:NROW(d))
for (n in len) {
d[n, num_obs := length(which(!is.na(d[n])))]
}
【问题讨论】:
-
喜欢
d[, num_obs := sum(!is.na(.SD)), by = 1:nrow(d)][]或d[, num_obs := rowSums(!is.na(d))][]? (不确定哪个会更快。) -
是的!这行得通。你能解释一下吗?如果我使用
by = 1:nrow(d),我认为 .SD 将等于整个数据集。这是如何按行执行的?编辑:另外,添加空链[ ]到底是做什么的?
标签: r data.table