将两个日期框架组合到相同的列中但在不同的日期下

时间:2017-07-10 23:31:36

标签: r merge

我有两个具有相同列名的数据框,但每个数据框的日期不同,如下所示:

#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给了我一个错误,揭示我的数据帧中有一些时间序列日期,并阻止我获得所需的数据帧合并。这是我为{I}使用的实际数据帧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 ...

4 个答案:

答案 0 :(得分:4)

library(dplyr)

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

答案 1 :(得分:2)

由于您的两个数据框包含不同的日期,您只需将它们与rbind合并到一个新的数据框中,然后根据日期列进行排序。 鉴于您的数据框包含时间序列(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

答案 2 :(得分:0)

我们可以在将数据集放入rbindlist后使用data.table中的list。在此处,mget会返回list中对象的值,然后按{Date>返回order

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

答案 3 :(得分:0)

使用bind_rows包中的arrangedplyr

library(dplyr)

bind_rows(df1, df2) %>% 
  arrange(Date)