2013-04-18 112 views
1

提供列名稱我有一個data.table,讓我們說test.dt,有一個名爲「ID」的列。列「id」的行涉及第二個data.table的列標題,例如counts.dt。我想提供計數中每列的長度以匹配原始test.dt中對應的行ID。例如:Data.table的列長度,從第二個data.table

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 

想法?

我試圖讓我的「sum」語句更加複雜,具有相同的結果,不同的eval函數。我一直無法找到這個問題的答案;任何幫助或重定向到類似的問題將不勝感激。

UPDATE: 我的實際數據有更多的較長的文本字符串作爲標識,使用應答如導致以下錯誤:

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] 

回答

2

試試這個:

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

非常好!謝謝。我將不得不再次研究with和na.rm,以便我將來不會忘記它們。 – Docuemada

+1

+1我認爲,未經測試的'counts.dt [,id,with = F]'部分可能只是'counts.dt [[id]]'。如果是這樣,應該避免調用'[.data.table()''的小開銷。 –

+0

我證實了這一點。謝謝! – Docuemada