【问题标题】:Take dates from one dataframe and filter data in another dataframe从一个数据框中获取日期并在另一个数据框中过滤数据
【发布时间】:2016-03-23 23:52:52
【问题描述】:

我有两个数据框,

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 再次对其进行过滤,然后将其附加到新的数据帧中。这对我来说需要很长时间,因为数据非常庞大。有没有更有效的方法来做到这一点?

谢谢

【问题讨论】:

    标签: r dplyr


    【解决方案1】:
    library(dplyr)
    df<-left_join(df,df1,by="user")
    df <- df %>% filter(date>=start_date & date<=end_date)
    

    【讨论】:

    • 哦……非常感谢……这个很简单。应该得到这个。 !!无论如何谢谢你:)
    • 有时会发生 :)
    • 你也可以直接通过管道进入过滤器df &lt;- left_join(df,df1,by="user") %&gt;% filter(date&gt;=start_date &amp; date&lt;=end_date)
    【解决方案2】:

    使用data.table v1.9.8+ 中最近实现的non-equi 连接功能,可以按如下方式完成:

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

    【讨论】:

      猜你喜欢
      • 2016-10-02
      • 2021-10-31
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 2021-09-09
      • 2019-01-20
      相关资源
      最近更新 更多