我有一个数据框,该数据框由包含日期,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
答案 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