1

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

1 回答 1

2

尝试这个:

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

最终,data.table可能会删除该with=FALSE选项,在这种情况下,马特的建议仍然有效:counts.dt[[id]]

于 2013-04-18T20:21:26.120 回答