开发者

Summing two dataframes based on common value

开发者 https://www.devze.com 2023-04-09 06:23 出处:网络
I have a dataframe that looks like day.of.week count 103 23开发者_如何学运维 1 341 451 563 and another like

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

精彩评论

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