1

「id」という列を持つdata.table、たとえばtest.dtがあります。列「id」の行は、counts.dt などの 2 番目の data.table の列ヘッダーを参照します。元の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

考え?

同じ結果を持つさまざまな評価関数を使用して、「合計」ステートメントをより複雑にしようとしました。この特定の質問に対する答えを見つけることができませんでした。同様の質問へのヘルプまたはリダイレクトをいただければ幸いです。

更新:私の実際のデータには、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ます。その場合、Matt の提案は引き続き機能します。counts.dt[[id]]

于 2013-04-18T20:21:26.120 に答える