Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-按日期排除包含事件的行_R - Fatal编程技术网

R-按日期排除包含事件的行

R-按日期排除包含事件的行,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

我有一个带有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", "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