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 回答