使用 dplyr 或 data.table 使用一个数据帧中的日期来过滤单独的数据帧

问题描述 投票:0回答:1

我有一个数据框,其中包含随着时间的推移从不同用户 (df) 收集的所有值(数据)。我有一个单独的数据框(df1),指示不同事件的开始/结束日期。我想使用第二个数据帧来过滤第一个数据帧中的值(即,仅保留某些事件之间的日期)。我的问题与这个问题相同 - 从一个数据框中获取日期并过滤另一个数据框中的数据。然而,这两个答案对我来说不起作用。 R 无法为 left_join 解决方案分配足够的内存大小(我有一个非常大的数据帧)。 data.table 答案几乎有效,但不是将所有日期粘贴到输出中,而是只粘贴开始日期(但似乎除此之外也有效 - 见下文)。对任一解决方案的任何修复将不胜感激。为了保持一致性,我保留了与最初问题中相同的示例代码......

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)

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')))

Dplyr 解决方案(由于内存大小,不适用于我的数据):

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

Data.table 解决方案(几乎有效,但只是粘贴开始日期而不是所有原始日期):

require(data.table)
setDT(df)[df1, .(user,date,data), on=.(user, date>=start_date, date<=end_date)]
r date dplyr filter data.table
1个回答
0
投票

这是使用

dplyr
的另一种方法。每组比较日期以替换
left_join

df %>%
  group_by(user) %>%
  filter(date >= df1$start_date[df1$user == first(user)]) %>%
  filter(date <= df1$end_date[df1$user == first(user)]) %>%
  ungroup()

请告诉我们执行时间是否有所改善。

© www.soinside.com 2019 - 2024. All rights reserved.