从一个数据框中取出日期,并在另一个数据框中过滤数据。

5

I have two 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的开始日期和结束日期之间。结果数据帧应具有以下输出,
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个回答

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

哦...非常感谢..这个很容易。本应该知道的。!! 不管怎样,谢谢 :) - haimen
有时候这种事情会发生 :) - adaien
2
你也可以直接将数据框传入过滤器中,如下所示: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)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接