2016-03-23 71 views
3

我有兩個dataframes,採取從一個數據幀和過濾數據日期在另一個數據幀

user=c(rep('A',7),rep('B',8)) 
data = seq(1:15) 
date = as.Date(c('2016-01-01','2016-01-02','2016-01-03','2016-01-04','2016-01-05','2016-01-06','2016-01-07','2016-01-08','2016-01-09','2016-01-10','2016-01-11','2016-01-12','2016-01-13','2016-01-14','2016-01-15')) 
df = data.frame(user,date,data) 

df 

     user date  data 
    1  A 2016-01-01 1 
    2  A 2016-01-02 2 
    3  A 2016-01-03 3 
    4  A 2016-01-04 4 
    5  A 2016-01-05 5 
    6  A 2016-01-06 6 
    7  A 2016-01-07 7 
    8  B 2016-01-08 8 
    9  B 2016-01-09 9 
    10 B 2016-01-10 10 
    11 B 2016-01-11 11 
    12 B 2016-01-12 12 
    13 B 2016-01-13 13 
    14 B 2016-01-14 14 
    15 B 2016-01-15 15 

df1 =data.frame(user = c('A','B'), start_date = as.Date(c('2016-01-02','2016-01-10')), end_date = as.Date(c('2016-01-06','2016-01-14'))) 
> df1 
    user start_date end_date 
1 A 2016-01-02 2016-01-06 
2 B 2016-01-10 2016-01-14 

我想借此從DF1開始日期和結束日期,並過濾記錄在df數據幀的日期列中。特定用戶的數據應該只在df1的start_date和end_date之間。將得到的數據幀應具有以下輸出,

user date  data 
    A 2016-01-02 2 
    A 2016-01-03 3 
    A 2016-01-04 4 
    A 2016-01-05 5 
    A 2016-01-06 6 
    B 2016-01-10 10 
    B 2016-01-11 11 
    B 2016-01-12 12 
    B 2016-01-13 13 
    B 2016-01-14 14 

我曾嘗試以下,

循環通過每個用戶,將它傳遞給一個數據幀。然後使用df1中相應條目的start_date和end_date再次對其進行過濾,然後將其附加到新的數據框中。由於數據非常龐大,這對我來說需要很長時間。有沒有更有效的方法來做到這一點?

感謝

回答

2
library(dplyr) 
df<-left_join(df,df1,by="user") 
df <- df %>% filter(date>=start_date & date<=end_date) 
+0

噢噢噢......謝謝很多..這一個很容易。應該有這個。 !無論如何謝謝:) – haimen

+0

有時它發生了:) – adaien

+1

你也可以直接進入過濾器'df < - left_join(df,df1,by =「user」)%>%filter(date> = start_date&date <= end_date )' – SymbolixAU

3

隨着近期實施非等距data.table v1.9.8 +連接功能,這是可以做到如下:

require(data.table) # v1.9.8+ 
setDT(df)[df1, .(user,date,data), on=.(user, date>=start_date, date<=end_date)]