开发者

Summing two dataframes based on common value

I have a dataframe that looks like

    day.of.week count
1           0     3
2           3    开发者_如何学运维 1
3           4     1
4           5     1
5           6     3

and another like

    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

I want to add the values from df1 to df2 based on day.of.week. I was trying to use ddply

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

which almost works, but merge combines rows that have a shared value. For instance in the example above for day.of.week=5. Rather than being merged to two records each with count one, it is instead merged to one record of count one, so instead of total count of two I get a total count of one.

       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


There is no need to merge. You can simply do

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

I have assumed that both data frames have identical column names day.of.week and count


In addition to the suggestion Ben gave you about using merge, you could also do this simply using subsetting:

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

This assumes no repeated day.of.week rows, since match will return only the first match.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜