如何匹配/合并R中两个不同文件的数据?

时间:2015-01-25 04:07:35

标签: r merge match

我有两个文件(file1.csv和file2.csv)。如下所示,file1包含两列日期和变量x1,其中包含365个观察值(全年)。文件2包含列日期作为file1和许多其他变量。我只对变量x45感兴趣,它只有24个观测值(每月2个观测值)。

文件1

date     x1
1/01/2005   33
2/01/2005   24
3/01/2005    72
31/12/2005   52

文件2

date     x2      x3     x45
1/01/2005               115
5/02/2005                125
13/04/2005               127
31/12/2005               138

所以我想将列x45添加到file1.csv看起来像

date    x1    x45
1/01/2005   33  115
2/01/2005   24    NA
3/01/2005    72   NA
31/12/2005   52           138

我尝试过使用

file1= read.csv("D:/file1.csv")
file2= read.csv("D:/file2.csv")
file3 = merge(file1, file2)

但是,文件3只有24行(观察),并省略了文件1中的其余观察结果。

如上所述获得结果的任何帮助都将非常感激。

3 个答案:

答案 0 :(得分:2)

您可以尝试left_join

library(dplyr)
left_join(df1, df2[c('date', 'x45')], by='date')
#         date x1 x45
#1  1/01/2005 33 115
#2  2/01/2005 24  NA
#3  3/01/2005 72  NA
#4 31/12/2005 52 138

或使用merge

merge(df1, df2[c('date', 'x45')], all.x=TRUE)
#       date x1 x45
#1  1/01/2005 33 115
#2  2/01/2005 24  NA
#3  3/01/2005 72  NA
#4 31/12/2005 52 138

更新

来自left_join的{​​{1}}和来自dplyr的{​​{1}}保留原始订单。如果您需要在join中保留订单,则可以选择创建" indx" in" df1"在plyr之后,可以使用" indx"

保留原始订单
merge

或使用merge

中的df1$indx <- 1:nrow(df1) merge(df1, df2[c('date', 'x45')], all.x=TRUE)[order(df1$indx),-3] date x1 x45 #1 1/01/2005 33 115 #2 2/01/2005 24 NA #3 3/01/2005 72 NA #4 31/12/2005 52 138
join

数据

plyr

答案 1 :(得分:2)

为了完整起见,您可以使用file1包非常快速地通过引用(不使用<-)加入和更新data.table

library(data.table)
setkey(setDT(file1), date)[file2, x45 := i.x45]
file1
#          date x1 x45
# 1:  1/01/2005 33 115
# 2:  2/01/2005 24  NA
# 3:  3/01/2005 72  NA
# 4: 31/12/2005 52 138

在此处,您可以在file1列旁边输入date并在file2上执行二进制加入,同时仅提取x45

答案 2 :(得分:0)

以下内容也可以使用,无需包,也不需要更改df1中行的原始顺序:

df1
#        date x1
#2  1/01/2005 33
#3  2/01/2005 24
#4  3/01/2005 72
#5 31/12/2005 52
df2
#        date x45
#1  1/01/2005  33
#2  2/01/2005  24
#3  3/01/2005  72
#4 31/12/2005  52

df1$x45 <- df2$x45[match(df1$date, df2$date)]

df1
#        date x1 x45
#2  1/01/2005 33  33
#3  2/01/2005 24  24
#4  3/01/2005 72  72
#5 31/12/2005 52  52