我有两个具有相同列名的数据框,但每个数据框的日期不同,如下所示:
#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 ...
答案 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
包中的arrange
和dplyr
:
library(dplyr)
bind_rows(df1, df2) %>%
arrange(Date)