0

次のようなサンプルデータフレームがありsample.dataます。

x   y   z
1   0   1
1   0   1
1   0   1
1   0   1
1   0   2
1   0   2
1   0   2
1   0   2
1   0   2
0   1   2

z のカテゴリごとに x と y の最大値と合計値を見つける必要があります (z は 1,2,...600 のようなものです)。これには plyr の ddply を使用します。

library(plyr)
z.group<-ddply (sample.data,.(z),summarize,max_x=max(x), max_y=max(y), sum_x=sum(x), sum_y=sum(y))

z.group 
 z   max_x  max_y  sum_x    sum_y
  1    1    0   4   0
  2    1    1   5   1

次に、これらを関連する行の下のsum_x, sum_y, max_x, and max_y列として挿入する必要があります。sample.dataたとえば、if max_x is 1 for z=1, then I insert max_x is 1 for all rows with z=1. 期待される出力は

x   y   z   max_x  max_y    sum_x  sum_y
1   0   1   1   0   4   0
1   0   1   1   0   4   0
1   0   1   1   0   4   0
1   0   1   1   0   4   0
1   0   2   1   1   5   1
1   0   2   1   1   5   1
1   0   2   1   1   5   1
1   0   2   1   1   5   1
1   0   2   1   1   5   1
0   1   2   1   1   5   1

どうすれば期待される出力を得ることができるのだろうか?

4

2 に答える 2

4

を使用して、ワンステップで直接行うことができますtransform

.group<-ddply (sample.data,.(z),transform,max_x=max(x), max_y=max(y), sum_x=sum(x), sum_y=sum(y))
> z.group
   x y z max_x max_y sum_x sum_y
1  1 0 1     1     0     4     0
2  1 0 1     1     0     4     0
3  1 0 1     1     0     4     0
4  1 0 1     1     0     4     0
5  1 0 2     1     1     5     1
6  1 0 2     1     1     5     1
7  1 0 2     1     1     5     1
8  1 0 2     1     1     5     1
9  1 0 2     1     1     5     1
10 0 1 2     1     1     5     1
于 2013-02-02T12:50:29.873 に答える
3

私はあなたがこれを行うことができると思いますmerge:

merge(sample.data, z.group, by="z")

#    z x y max_x max_y sum_x sum_y
# 1  1 1 0     1     0     4     0
# 2  1 1 0     1     0     4     0
# 3  1 1 0     1     0     4     0
# 4  1 1 0     1     0     4     0
# 5  2 1 0     1     1     5     1
# 6  2 1 0     1     1     5     1
# 7  2 1 0     1     1     5     1
# 8  2 1 0     1     1     5     1
# 9  2 1 0     1     1     5     1
# 10 2 0 1     1     1     5     1

別のdata.table方法:

require(data.table)
dt <- data.table(sample.data, key="z")
dt[, list(x=x, y=y, max_x=max(x), max_y=max(y), sum_x=sum(x), sum_y=sum(y)), by=z]

さらに優れた/より短い解決策(@agstudyが示唆したように、可能である必要があります):

dt[, `:=`(max_x=max(x), max_y=max(y), sum_x=sum(x), sum_y=sum(y)), by=z]
于 2013-02-02T12:47:06.433 に答える