我有一个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)
}
返回: 按预期计算:
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]
答案 0 :(得分:2)
试试这个:
test.dt[, count := sum(counts.dt[, id, with = F], na.rm = T), by = id]