基于共同值对两个数据帧求和

时间:2011-09-28 16:25:04

标签: r

我的数据框看起来像

    day.of.week count
1           0     3
2           3     1
3           4     1
4           5     1
5           6     3

和另一个像

    day.of.week count
1           0    17
2           1     6
3           2     1
4           3     1
5           4     5
6           5     1
7           6    13

我想根据day.of.week将df1中的值添加到df2。我试图使用ddply

total=ddply(merge(total, subtotal, all.x=TRUE,all.y=TRUE),
                   .(day.of.week), summarize, count=sum(count))

几乎可以工作,但merge合并了具有共享值的行。例如,在上面的例子中,day.of.week = 5。它不是合并到两个记录,每个记录都计数一次,而是合并到一个记录中,而不是总计数为2,而是总计数为一。

       day.of.week count
  1            0     3
  2            0    17
  3            1     6
  4            2     1
  5            3     1
  6            4     1
  7            4     5
  8            5     1
  9            6     3
  10           6    13

2 个答案:

答案 0 :(得分:7)

无需合并。你可以简单地做

ddply(rbind(d1, d2), .(day.of.week), summarize, sum_count = sum(count))

我假设两个数据框都有相同的列名day.of.weekcount

答案 1 :(得分:1)

除了Ben给你关于使用merge的建议之外,你还可以使用子集来做到这一点:

d1 <- read.table(textConnection("    day.of.week count
1           0     3
2           3     1
3           4     1
4           5     1
5           6     3"),sep="",header = TRUE)

d2 <- read.table(textConnection("    day.of.week count1
1           0    17
2           1     6
3           2     1
4           3     1
5           4     5
6           5     1
7           6    13"),sep = "",header = TRUE)

d2[match(d1[,1],d2[,1]),2] <- d2[match(d1[,1],d2[,1]),2] + d1[,2]
> d2
  day.of.week count1
1           0     20
2           1      6
3           2      1
4           3      2
5           4      6
6           5      2
7           6     16

这假定没有重复的day.of.week行,因为match只返回第一个匹配。