9

data.table大規模なデータセットに対して非常に単純なタスクを達成するために使用したいと考えています。

各 ID の val1 と val2 の平均を計算します。

詳しくは添付のフェイクデータをご確認ください。

library(data.table)
DT <- data.table(ID = paste0("ID",rep(1:5,each=2)),
      level= rep(c("CTRL","CTRL","ID1","ID2","ID3"),2),
      val1 = 1:10, 
      val2 = rnorm(10))

ここでは、ID ごとに val1 と val2 の平均を計算します。

また、各 ID にはさまざまなレベルがあることに注意してください。しかし、一意の ID ごとに、異なるレベル val1 と val2 を組み込んだ 1 つの平均が必要です。

--- ID | 平均 - -

-- ID1 | ...

-- ID2 | ...

-- ID3 | ...

次のコードを試しましたが、うまくいきません。

topagents <- DT[, mean = mean(list(val1,val2)), 
                    by = ID]

しかし、うまくいきません。reshape2最初meltに でそれを行う方法を知っていますdcast

しかし、元のデータセットは 2,000 万行と 12 フィールドと比較的大きく、計算にかなりの時間がかかります。

したがって、data.tableまたはを使用することを好みますdplyr

4

4 に答える 4

7

Encapsulate the calls to mean in the list, rather than taking the mean of a list, which you can't do:

DT[, j=list(val1=mean(val1), val2=mean(val2)), by=ID]
    ID val1       val2
1: ID1  1.5  0.1389794
2: ID2  3.5  0.3392179
3: ID3  5.5 -0.6336174
4: ID4  7.5  0.9941148
5: ID5  9.5  0.1324782

To get a single value, the mean of the val1 and val2 values, combine these and pass to mean:

DT[, j=list(mean=mean(c(val1,val2))), by=ID]
    ID      mean
1: ID1 0.8194897
2: ID2 1.9196090
3: ID3 2.4331913
4: ID4 4.2470574
5: ID5 4.8162391

Using a list for the single element of j here is an easy way to name the resulting column.

于 2014-01-15T04:37:54.207 に答える
5
topagents <- DT[, mean(c(val1,val2)), by = ID]

mean はベクトルしか取れず、リストを理解できません。

あなたの質問は、「IDごとにval1とval2の平均を計算する」と言っていました。しかし、Mathew の回答に基づいて、「ID ごとに val1 と val2 の平均 (複数) を計算する」ことが必要になる場合があります。

于 2014-01-15T04:39:52.620 に答える