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

5

У меня есть 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 или изменил библиотеку, но мне было трудно достать их.

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

@ Чейз, прошу прощения за ошибку, да, ты прав, я только что исправил user1489597
@Justin, если год в merge_data_2 совпадает с year1 и year2 в merge_data_1, то я хочу суммировать сумму user1489597
Что делать, если через годmerge_data_2 соответствует обоимyear1 а такжеyear2 вmerge_data_1? Justin
Наконец, должен ли столбец суммы суммироваться по некоторым другим столбцам? Я возвращаю три строки для ID2, которые имеют значения 500 300 400 ... на общую сумму 1200, но их суммирование не упоминается в ваших требованиях. Просьба уточнить. Chase
Я не думаю, что ваши входные данные соответствуют вашим выходным данным, в частности, я не думаю, что школаe будет соответствовать. Я также получаю сообщение об ошибке в вашем первом фрагменте кода, потому чтоyear1 не существует в то время, когда вы создаетеyear2... я предполагаю, что вы уже определили это ранее в вашей рабочей области, но это не работает при запуске чистой установки R. Chase

Ваш Ответ

1   ответ
11

Как отмечалось выше, я думаю, что у вас есть некоторые расхождения между вашими примерами входных и выходных данных. Вот основной подход - вы были на правильном пути с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
@ user1489597 - должен быть пустой & quot; check & quot; Отметьте рядом с моим ответом, который вы можете выбрать. Затем он должен стать «зеленым» указывая, что это предпочтительный ответ.
Это почти то, что мне нужно, большое спасибо! Кстати, как мне пометить этот ответ? user1489597
все сделано, еще раз спасибо! :П user1489597

Похожие вопросы