满足条件时R滞后

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

我有一个仅包含体检日期和感染存在(是/否)的数据框,我想添加第三列代表上次感染的日期。如果患者以前没有感染,则新的last_infection列应为NA。如果他们以前曾感染过,则应在他们对感染的测试为“是”的情况下,显示最<次访问的日期。]我希望输出看起来像这样:

date infection last_infection 01-01-18 no NA 06-01-18 no NA 07-01-18 yes NA 09-01-18 no 07-01-18 01-01-19 no 07-01-18 02-01-19 yes 07-01-18 03-01-19 yes 02-01-19 04-01-19 no 03-01-19 05-01-19 no 03-01-19

如何在R中执行此操作?是否可以使用lag()之类的功能检查条件,还是应该完全执行其他操作?

我有一个仅包含体检日期和感染存在(是/否)的数据框,我想添加第三列代表上次感染的日期。新的last_infection列...

r function lag
2个回答
0
投票
我们可以基于使用'infection'创建的逻辑向量创建分组变量,并将其用于lag列。在这里,我们仅加载dplyr,不加载任何其他软件包

library(dplyr) df1 %>% group_by(grp = cumsum(infection == "yes")) %>% mutate(new = first(date)) %>% ungroup %>% mutate(new = replace(lag(new), seq_len(match(1, grp)), NA)) %>% select(-grp) # A tibble: 9 x 4 # date infection last_infection new # <chr> <chr> <chr> <chr> #1 01-01-18 no <NA> <NA> #2 06-01-18 no <NA> <NA> #3 07-01-18 yes <NA> <NA> #4 09-01-18 no 07-01-18 07-01-18 #5 01-01-19 no 07-01-18 07-01-18 #6 02-01-19 yes 07-01-18 07-01-18 #7 03-01-19 yes 02-01-19 02-01-19 #8 04-01-19 no 03-01-19 03-01-19 #9 05-01-19 no 03-01-19 03-01-19


2
投票
我会建议这样的事情。如果您使用tidyr软件包中的fill,则无需使用cumsum或分组。
© www.soinside.com 2019 - 2024. All rights reserved.