我有两个文件(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中的其余观察结果。
如上所述获得结果的任何帮助都将非常感激。
答案 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