R-按日期排除包含事件的行
我有一个带有ID、输入日期、事件(X1.0和X1.1)以及与事件时间(X2.0和X2.1)对应的日期的数据框。我需要找到在参赛日期之前参加过特定活动的人的IDR-按日期排除包含事件的行,r,R,我有一个带有ID、输入日期、事件(X1.0和X1.1)以及与事件时间(X2.0和X2.1)对应的日期的数据框。我需要找到在参赛日期之前参加过特定活动的人的ID library(dplyr) df <- data.frame(ID = as.integer(c(10001, 10002, 10004, 10005, 10006)), entry_date = as.Date(c("2013-12-22", "2013-02-13", "2013-03-13
library(dplyr)
df <- data.frame(ID = as.integer(c(10001, 10002, 10004, 10005, 10006)),
entry_date = as.Date(c("2013-12-22", "2013-02-13", "2013-03-13", "2013-01-01", "2013-02-02")),
X1.0 = as.integer(c(150, NA, 120, NA, 150)),
X1.1 = as.integer(c(120, 180, NA, 150, 120)),
X2.0 = as.Date(c("2017-02-13", NA, "2014-06-04", NA, "1990-03-08")),
X2.1 = as.Date(c("2003-12-22", "2011-02-13", NA, "1998-01-01", "2015-02-01")))
#filtering columns that begin with X1 by event 150
> dplyr::filter_at(df, vars(starts_with("X1")), any_vars(. == 150))
ID entry_date X1.0 X1.1 X2.0 X2.1
1 10001 2013-12-22 150 120 2017-02-13 2003-12-22
2 10005 2013-01-01 NA 150 <NA> 1998-01-01
3 10006 2013-02-02 150 120 1990-03-08 2015-02-01
库(dplyr)
df dplyr::过滤器位于(df,变量(以“X1”开头),任何变量(.==150))
ID输入日期X1.0 X1.1 X2.0 X2.1
1 10001 2013-12-22 150 120 2017-02-13 2003-12-22
210005 2013-01-01 NA 150 1998-01-01
3 10006 2013-02-02 150 120 1990-03-08 2015-02-01
我的问题是有条件地筛选日期,因为我只对筛选在输入日期之前发生的“150”事件感兴趣,而且还有其他事件存在。最终结果应如下所示:
ID entry_date X1.0 X1.1 X2.0 X2.1
1 10005 2013-01-01 NA 150 <NA> 1998-01-01
2 10006 2013-02-02 150 120 1990-03-08 2015-02-01
ID条目\u日期X1.0 X1.1 X2.0 X2.1
10005 2013-01-01 NA 150 1998-01-01
2 10006 2013-02-02 150 120 1990-03-08 2015-02-01
我们可以获取长格式的数据,在单独的列中获取事件值和事件日期。然后,我们只能选择事件值为150且entry\u date
大于事件日期的行。我们将这些数据连接回df
,以获得所有相应的列
library(dplyr)
df %>%
tidyr::pivot_longer(cols = -c(ID, entry_date),
names_to = c('.value', 'col'),
names_sep = "\\.") %>%
filter(X1 == 150 & entry_date > X2) %>%
select(ID) %>%
left_join(df, by = 'ID')
# ID entry_date X1.0 X1.1 X2.0 X2.1
# <int> <date> <int> <int> <date> <date>
#1 10005 2013-01-01 NA 150 NA 1998-01-01
#2 10006 2013-02-02 150 120 1990-03-08 2015-02-01
库(dplyr)
df%>%
tidyr::pivot_更长(cols=-c(ID,输入日期),
名称_to=c('.value',col'),
名称\u sep=“\\.”%>%
过滤器(X1==150,输入日期>X2)%>%
选择(ID)%>%
左联合(df,by='ID')
#ID输入日期X1.0 X1.1 X2.0 X2.1
#
#11005 2013-01-01 NA 150 NA 1998-01-01
#2 10006 2013-02-02 150 120 1990-03-08 2015-02-01
这是另一个过滤器功能的解决方案管道:
dplyr::filter_at(df, vars(starts_with("X1")), any_vars(. == 150)) %>%
filter(X2.0 <= entry_date | is.na(X2.0))
# ID entry_date X1.0 X1.1 X2.0 X2.1
#1 10005 2013-01-01 NA 150 <NA> 1998-01-01
#2 10006 2013-02-02 150 120 1990-03-08 2015-02-01
dplyr::在(df,vars(以“X1”开头),任何变量(.==150))%>%
滤波器(X2.0