我有一个 data.table,比如说 test.dt,有一个名为“id”的列。列“id”的行指的是第二个 data.table 的列标题,比如 counts.dt。我想提供每列的长度以与原始 test.dt 中的相应行 ID 相匹配。例如:
test <- function() {
library(data.table)
test.dt <- data.table(id=c("a","b","c"),other=1:3)
counts.dt <- data.table(a=c(1,NA,NA,NA),b=c(1,1,NA,NA),c=c(1,1,1,1),d=1:4,e=1:4)
print(counts.dt)
test.dt<-test.dt[,count:=sum(!is.na(counts.dt[,id]))]
print(test.dt)
}
哪个返回:counts.dt 符合预期:
a b c d e
1: 1 1 1 1 1
2: NA 1 1 2 2
3: NA NA 1 3 3
4: NA NA 1 4 4
但是,test.dt 似乎不是计算 counts.dt 列中非 NA 元素的数量,而是 test.dt 的长度导致:
id other count
1: a 1 3
2: b 2 3
3: c 3 3
我想要的是这样的表格:
id other count
1: a 1 1
2: b 2 2
3: c 3 4
想法?
我尝试使用具有相同结果的不同 eval 函数使我的“sum”语句更复杂。我无法找到这个特定问题的答案;任何帮助或重定向到类似问题将不胜感激。
更新:我的实际数据有更长的文本字符串作为 ID,使用所示答案导致以下错误:
Error in Math.factor(j) : abs not meaningful for factors
但是,我能够通过以下方式使事情进展:
get.length<-function(x){return(as.character(x))}
test.dt<-test.dt[,count:= sum(!is.na(counts.dt[,get.length(id),with=FALSE]),na.rm=TRUE),by=id]