2017-07-10 80 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) 
相關問題