2017-07-10 51 views
1

我有相同的列名的两个数据帧,但对于每一个日期是不同的,就像这样:结合两个日期帧到同一列,但在不同的日期

#df1 
     Date  col1 col2 col3 
1 2017-07-10 1  2  3 
2 2017-07-17 4  5  6 
3 2017-07-24 7  8  9 

#df2 
     Date  col1 col2 col3 
1 2017-07-11 10  11  12 
2 2017-07-18 13  14  15 
3 2017-07-25 16  17  18 

我想合并两个要获得相同的列, 但保留信息到相应的日期,并下令一个数据帧由上行日期,像这样:

#desired result 
     Date  col1 col2 col3 
1 2017-07-10 1  2  3 
2 2017-07-11 10  11  12 
3 2017-07-17 4  5  6 
4 2017-07-18 13  14  15 
5 2017-07-24 7  8  9 
6 2017-07-25 16  17  18 

我到它是使用merge(df1, df2, by = "Date", all = TRUE)最接近的,但是这给了我:

 Date  col1 col2 col3 col1 col2 col3 
1 2017-07-10 1  2  3  NA  NA  NA 
2 2017-07-11 NA  NA  NA  10  11  12 
3 2017-07-17 4  5  6  NA  NA  NA 
4 2017-07-18 NA  NA  NA  13  14  15 
5 2017-07-24 7  8  9  NA  NA  NA 
6 2017-07-25 NA  NA  NA  16  17  18 

编辑:所以想rbind给我一个错误,表明我有我的dataframes一些时间序列的日期和阻止我获取数据帧所需的合并。下面是输出,当我做的实际dataframes str(df1)str(df2)我使用:

str(df1) 
data.frame': 14 obs. of 4 variables: 
$ Date: Date, format: "2017-07-10" "2017-07-17" "2017-07-24" "2017-07-31" 
... 
$ bal : Time-Series from 128 to 141: 12448736 12557277 12549660 12517634 
12480479 ... 
$ 80 : Time-Series from 128 to 141: 14825217 15032135 15047306 15029003 
15003920 ... 
$ 95 : Time-Series from 128 to 141: 16083250 16342246 16369480 16358442 
16339749 ... 

str(df2) 
'data.frame': 14 obs. of 4 variables: 
$ Date: Date, format: "2017-07-04" "2017-07-11" "2017-07-18" "2017-07-25" 
... 
$ bal : Time-Series from 143 to 156: 6059787 6059787 6059787 6059787 
6059787 ... 
$ 80 : Time-Series from 143 to 156: 11234537 11239924 11245305 11250681 
11256051 ... 
$ 95 : Time-Series from 143 to 156: 1.4e+07 1.4e+07 1.4e+07 1.4e+07 
1.4e+07 ... 
+0

使用'rbind',而不是'merge' – HubertL

+0

也许你可以在Base R中尝试'dplyr :: bind_rows'或'rbind'。 – HNSKD

回答

3
library(dplyr) 

union_all(df1, df2) %>% 
    arrange(date) 
+0

这样做!谢谢! – erik7970

2

至于你的两个dataframes包含不同的日期,你可以简单地用rbind将它们合并成一个新的数据帧,并责令根据日期列。 鉴于您的dataframes包含时间序列(ts)对象,你首先必须做rbind之前,这些转换为数值。

df1 = data.frame(df1[1],apply(df1[-1],2,as.numeric)) 
df2 = data.frame(df2[1],apply(df2[-1],2,as.numeric)) 
df = rbind(df1,df2) 
df = df[order(df$Date),] 
     Date col1 col2 col3 
1 2017-07-10 1 2 3 
4 2017-07-11 10 11 12 
2 2017-07-17 4 5 6 
5 2017-07-18 13 14 15 
3 2017-07-24 7 8 9 
6 2017-07-25 16 17 18 
+0

当我用'rbind'的实际DF我的工作,我在'[<得到'错误 - ts'('* TMP *',RI值= C(6059786.87467336,6059786.87467336,: 只更换元素是allowed'。我不知道这是为什么。 – erik7970

+0

做你dataframes包含时间序列(TS)对象?检查STR(DF1)和STR(DF2)。 – Lamia

+0

看起来它对于DF1,它说,它包含时序值从128到141和DF2,它说的时间序列,从143到156 – erik7970

0

我们可以把数据集在list后使用rbindlistdata.table。在这里,mget返回对象在list,然后通过 '日期'

library(data.table) 
rbindlist(mget(paste0('df', 1:2)))[order(Date)] 
#   Date col1 col2 col3 
#1: 2017-07-10 1 2 3 
#2: 2017-07-11 10 11 12 
#3: 2017-07-17 4 5 6 
#4: 2017-07-18 13 14 15 
#5: 2017-07-24 7 8 9 
#6: 2017-07-25 16 17 18 
0

dplyr包使用bind_rowsarrangeorder值:

library(dplyr) 

bind_rows(df1, df2) %>% 
    arrange(Date) 
相关问题