计算data.table的列长度,列名由第二个data.table提供

时间:2013-04-18 19:51:34

标签: r nested data.table

我有一个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]

1 个答案:

答案 0 :(得分:2)

试试这个:

test.dt[, count := sum(counts.dt[, id, with = F], na.rm = T), by = id]