Объединить 2 фрейма данных на основе 2 столбцов с разными именами столбцов

У меня есть 2 очень больших набора данных, который выглядит следующим образом:

merge_data <- data.frame(ID = c(1,2,3,4,5,6,7,8,9,10), 
                         position=c("yes","no","yes","no","yes", 
                                    "no","yes","no","yes","yes"),
                         school = c("a","b","a","a","c","b","c","d","d","e"),
                         year1 = c(2000,2000,2000,2001,2001,2000,
                                   2003,2005,2008,2009), 
                         year2=year1-1)


 merge_data

 ID position school year1 year2
 1   1  support   a  2000  1999
 2   2   oppose   b  2000  1999
 3   3  support   a  2000  1999
 4   4   oppose   a  2001  2000
 5   5  support   c  2001  2000
 6   6   oppose   b  2000  1999
 7   7  support   c  2003  2002
 8   8   oppose   d  2005  2004
 9   9  support   d  2008  2007
 10 10  support   e  2009  2008



merge_data_2 <- data.frame(year=c(1999,1999,2000,2000,2000,2001,2003
                                  ,2012,2009,2009,2008,2002,2009,2005,
                                  2001,2000,2002,2000,2008,2005),
                           amount=c(100,200,300,400,500,600,700,800,900,
                                    1000,1100,1200,1300,1400,1500,1600,
                                    1700,1800,1900,2000), 
                           ID=c(1,1,2,2,2,3,3,3,5,6,8,9,10,13,15,17,19,20,21,7))


  merge_data_2
   year amount ID
1  1999    100  1
2  1999    200  1
3  2000    300  2
4  2000    400  2
5  2000    500  2
6  2001    600  3
7  2003    700  3
8  2012    800  3
9  2009    900  5
10 2009   1000  6
11 2008   1100  8
12 2002   1200  9
13 2009   1300 10
14 2005   1400 13
15 2001   1500 15
16 2000   1600 17
17 2002   1700 19
18 2000   1800 20
19 2008   1900 21
20 2005   2000  7

И что я хочу это:

 ID position school year1 year2 amount
 1    yes    a      2000  1999  300
 2    no     b      2000  1999  1200
10    yes    e      2009  2008  1300

для ID = 1 в merge_data_2 у нас есть сумма = 300, поскольку есть 2 случая, когда ID = 1, и их год1 или год1 равен году идентификатора = 1 в merge_data

Поэтому я хочу выполнить слияние на основе идентификатора и года. 2 условия:

ID from merge_data matches the ID from merge_data_2 one of the year1 and year2 from merge_data also matches the year from merge_data_2. then make the merge based on the sum of the amount for each IDs.

и я думаю, что код будет выглядеть примерно так:

merge_data_final <- merge(merge_data, merge_data_2, 
                          merge_data$ID == merge_data_2$ID && (merge_data$year1 || 
                            merge_data$year2 == merge_data_2$year))

Then somehow to aggregate the amount by ID.

Очевидно, я знаю, что код неправильный, и я думал о plyr или изменил библиотеку, но мне было трудно достать их.

Любая помощь будет отличной! Спасибо, парни!

 Chase21 авг. 2012 г., 22:08
Наконец, должен ли столбец суммы суммироваться по некоторым другим столбцам? Я возвращаю три строки для ID2, которые имеют значения 500 300 400 ... на общую сумму 1200, но их суммирование не упоминается в ваших требованиях. Просьба уточнить.
 Justin21 авг. 2012 г., 21:53
Что делать, если через годmerge_data_2 соответствует обоимyear1 а такжеyear2 вmerge_data_1?
 user148959721 авг. 2012 г., 22:23
@ Чейз, прошу прощения за ошибку, да, ты прав, я только что исправил
 user148959721 авг. 2012 г., 22:20
@Justin, если год в merge_data_2 совпадает с year1 и year2 в merge_data_1, то я хочу суммировать сумму
 Chase21 авг. 2012 г., 22:07
Я не думаю, что ваши входные данные соответствуют вашим выходным данным, в частности, я не думаю, что школаe будет соответствовать. Я также получаю сообщение об ошибке в вашем первом фрагменте кода, потому чтоyear1 не существует в то время, когда вы создаетеyear2... я предполагаю, что вы уже определили это ранее в вашей рабочей области, но это не работает при запуске чистой установки R.

Ответы на вопрос(1)

Решение Вопроса

Как отмечалось выше, я думаю, что у вас есть некоторые расхождения между вашими примерами входных и выходных данных. Вот основной подход - вы были на правильном пути сreshape2, Вы можете простоmelt() ваши данные в длинном формате, так что вы объединяетесь в один столбец вместо того, чтобы / или бит, который вы использовали ранее.

library(reshape2)
#melt into long format
merge_data_m <- melt(merge_data, measure.vars = c("year1", "year2"))
#merge together, specifying the joining columns
merge(merge_data_m, merge_data_2, by.x = c("ID", "value"), by.y = c("ID", "year"))
#-----
  ID value position school variable amount
1  1  1999      yes      a    year2    100
2  1  1999      yes      a    year2    200
3  2  2000       no      b    year1    500
4  2  2000       no      b    year1    300
5  2  2000       no      b    year1    400
 user148959721 авг. 2012 г., 22:55
все сделано, еще раз спасибо! :П
 user148959721 авг. 2012 г., 22:44
Это почти то, что мне нужно, большое спасибо! Кстати, как мне пометить этот ответ?
 21 авг. 2012 г., 22:49
@ user1489597 - должен быть пустой & quot; check & quot; Отметьте рядом с моим ответом, который вы можете выбрать. Затем он должен стать «зеленым» указывая, что это предпочтительный ответ.

Ваш ответ на вопрос