Суммирование двух кадров данных на основе общего значения - PullRequest
4 голосов
/ 28 сентября 2011

У меня есть фрейм данных, который выглядит как

    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

Я хочу добавить значения из df1 в df2 на основе day.of.week.Я пытался использовать ddply

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

, который почти работает, но объединение объединяет строки, которые имеют общее значение.Например, в приведенном выше примере для day.of.week = 5.Вместо слияния с двумя записями, каждая с номером один, вместо этого он объединяется с одной записью с номером один, поэтому вместо общего количества двух я получаю общий счет один.

       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 ]

7 голосов
/ 28 сентября 2011

Нет необходимости сливаться. Вы можете просто сделать

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

Я предположил, что оба фрейма данных имеют одинаковые имена столбцов day.of.week и count

1 голос
/ 28 сентября 2011

В дополнение к предложению, которое Бен дал вам об использовании 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 вернеттолько первый матч.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...