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]
非常好!謝謝。我將不得不再次研究with和na.rm,以便我將來不會忘記它們。 – Docuemada
+1我認爲,未經測試的'counts.dt [,id,with = F]'部分可能只是'counts.dt [[id]]'。如果是這樣,應該避免調用'[.data.table()''的小開銷。 –
我證實了這一點。謝謝! – Docuemada