根据列中的值对df进行分组,并在给定日期之前和之后30天进行检索

时间:2019-02-28 13:56:25

标签: r

我有一个数据框,该数据框由包含日期,Id和虚拟变量(类似于下面的设置)的列组成。

我想减去ID为'56'的行,其中日期为2014-12-03 +给定日期前后30天。与ID“ 1998”相同。

      date     Dummy  ID
1   2014-12-01  1932     56
2   2014-12-02  1828     201
3   2014-12-03  2349     56
4   2014-12-04  8192     100
5   2014-12-05  3188     56
6   2014-12-06  3277     1998

v1 = c(56, 1998)
v2 = c(2014-12-03, 2014-12-06)

最后显示如下内容

      date     Dummy  ID
1   2014-12-01  1932     56
3   2014-12-03  2349     56
5   2014-12-05  3188     56
6   2014-12-06  3277     1998

2 个答案:

答案 0 :(得分:3)

library(data.table)
library(dplyr)

data <- data.table(
  date = seq(as.Date("2014/12/1"), as.Date("2014/12/6"), "days"),
  Dummy = c(1932, 1828, 2349, 8192, 3188, 3277),
  ID = c(56, 201, 56, 100, 56, 1998)
  )


given_date <- as.Date("2014/12/3")

data %>% 
  filter(between(date, given_date - 30, given_date + 30), ID == 56 | ID == 1998)

输出:

        date Dummy   ID
1 2014-12-01  1932   56
2 2014-12-03  2349   56
3 2014-12-05  3188   56
4 2014-12-06  3277 1998

答案 1 :(得分:1)

一个基本的选择是您根据自己的条件制作一个数据框,并通过ID将其连接到最初的数据框,然后进行过滤:

library(dplyr)

matchdf <- data.frame(ID = c(56, 1998),
                      conditions = c("2014-12-03", "2014-12-06"))

df %>%
  left_join(matchdf, by = "ID") %>%
  mutate_at(vars(date, conditions), list(~ as.Date)) %>%
  filter(date >= conditions - 30 & date <= conditions + 30) %>%
  select(-conditions)

输出:

        date Dummy   ID
1 2014-12-01  1932   56
2 2014-12-03  2349   56
3 2014-12-05  3188   56
4 2014-12-06  3277 1998