【问题标题】:Merge 2 data frame based on 2 columns with different column names基于具有不同列名的 2 列合并 2 个数据框
【发布时间】:2012-08-22 04:26:31
【问题描述】:

我有 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

对于merge_data_2中的ID=1,我们有amount =300,因为有2种情况ID=1,并且它们的year1或year1等于merge_data中ID=1的年份

所以基本上我想要的是根据 ID 和年份执行合并。 2个条件:

  1. merge_data 中的 ID 与 merge_data_2 中的 ID 匹配
  2. merge_data 中的 year1 和 year2 之一也与 merge_data_2 中的年份匹配。 然后根据每个 ID 的金额之和进行合并。

我认为代码会是这样的:

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 或 reshape 库,但很难掌握它们。

任何帮助都会很棒!谢谢大家!

【问题讨论】:

  • 如果merge_data_2 中的年份同时匹配merge_data_1 中的year1year2 怎么办?
  • 我认为您的输入数据与您的输出数据不匹配,特别是我认为学校e 不会匹配。我在您的第一个代码块中也遇到了一个错误,因为在您创建 year2year1 不存在...我的猜测是您之前在工作区中定义了它,但是在运行时失败了干净的 R 安装。
  • 最后,金额列是否应该与其他一些列相加?我为 ID2 返回三行,其值为 500,300,400...总计 1200,但在您的要求中未提及将它们相加。请澄清。
  • @Justin,如果 merge_data_2 中的 year 与 merge_data_1 中的 year1 和 year2 匹配,那么我想求和
  • @Chase,我的错误很抱歉,是的,你是对的,我刚刚更正了它

标签: 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

【讨论】:

  • 这差不多就是我需要的了,非常感谢!!顺便说一句,我如何标记这个答案?
  • @user1489597 - 我的答案旁边应该有一个空白的“复选”标记,您可以选择。然后它应该变成“绿色”,表明这是首选答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
相关资源
最近更新 更多