我尝试计算每行不包含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))][]
?(不确定哪个更快。) - A5C1D2H2I1M1N2O1R2T1by = 1:nrow(d)
,.SD
将等于整个数据集。那么它是如何按行执行的呢? 另外,加上空链[ ]
到底是做什么用的? - Reilstein