1

指定された各グループの変数を計算するために data.table を使用したいと思います。簡単にするために、データが x1 のグループに従って分割されているとしましょう。

x1  x2
a   3
a   4
b   1
b   5

そして、各グループの平均値の変数を作成したいのですが、各グループにインデックスを付ける方法がわかりません:

DT[,list(
    mean_a=mean(x2) #for all rows containing "a"
    mean_b=mean(x2) #for all rows containing "b"
  by="x1")]

コメントで行を書き直すにはどうすればよいですか? (つまり、「a」を含むすべての行の平均を見つけます。「b」も同じです)

さらに処理されるため、個別の列に data.table として出力する必要があります。

mean_a  mean_b
3.5     3

編集:それで遊んだ後、ここに私が望んでいた解決策があります。

> DT2=DT[,list(
+     mean_a=mean(x[grep("a",x1),x2]),
+     mean_b=mean(x[grep("b",x1),x2])),
+     by=NULL]
> 
> DT2
   mean_a mean_b
1:    3.5      3

これは Frank のものほど効率的ではありませんが、最初に私が求めていたものです。つまり、行をコメントで書き直しました。

4

2 に答える 2

4

の値ごとに個別に名前を設定するのは時間の無駄だと思いx1ます。適切な接頭辞を選択してください:

dt[,mean(x2),by=x1][,{
    names(V1) <- paste("mean_",x1,sep="")
    do.call(data.table,as.list(V1))
}]

ただし、カスタム名が本当に必要な場合は、事前にそれらをベクターに入れることができます。

mynames <- c(
a = "mean_a",
b = "mean_b"
)

dt[,mean(x2),by=x1][,{
    names(V1) <- mynames[x1]
    do.call(data.table,as.list(V1))
}]

結果は

   mean_a mean_b
1:    3.5      3

編集:@eddiが指摘したように、これは同じことを行うより良い方法です:

setnames(dt[,mean(x2),keyby=x1][, as.list(V1)], sort(mynames))

これをどこかに割り当てると、それが望ましいものであることがわかりますdata.table[]呼び出しの最後に追加するか、全体を括弧に入れて印刷することもできます。

于 2013-05-31T15:56:26.713 に答える
0

もっとエレガントな解決策があると確信していますが、これはうまくいきます:

x1 <- c('a','a','b','b')
x2 <- c(3,4,1,5)

df=data.frame(as.factor(x1),x2)
groupmeans = sapply(unique(x1), function(x) {mean(df[x1==x,]$x2)})

#   a    b
# 3.5  3.0

groupmeans_table = data.table(t(groupmeans))

#       a  b
# 1:  3.5  3
于 2013-05-31T15:39:41.130 に答える