我有这样的数据:
ID visit Switch
1 1 0
1 2 1
2 1 1
2 2 0
3 1 NA
3 2 1
3 3 0
3 4 0
4 1 1
我希望创建一种滞后变量,对于多次访视的患者,一旦开关为1,之后的值将始终为1,一旦开关为0,其他值继续为0或NA,之后的值将始终为0,而NA或仅1次访视的患者将被设置为NA。
我想要的结果变量如下。
ID visit Switch NewVar
1 1 0 NA
1 2 1 0
2 1 1 NA
2 2 0 1
3 1 NA NA
3 2 1 NA
3 3 0 1
3 4 0 1
4 1 1 NA
我尝试了下面的方法,但似乎不适用于那些访问次数超过2次的人
dtmults = dt %>% distinct(ID,visits) %>% group_by(ID) %>% filter(n()>1) %>% arrange(ID)
dt %>%
filter(ID %in% dtmults$ID) %>%
arrange(ID, visits) %>%
group_by(ID) %>%
mutate(var = Switch, var2 = lag(switch), var3 = var2) %>%
fill(var3,.direction="down") %>% rename(NewVar = var3)
我的问题是,对于像ID == 3这样的,结果看起来像这样
ID visit Switch NewVar
3 1 NA NA
3 2 1 NA
3 3 0 1
3 4 0 0
我到底应该做什么来确保一旦ID的switch ==1,那么在未来的访问中,Newvar的所有值也都是1,而不管它可能是什么值?我在想创建一个rownumber变量,在这种情况下,rownumber在哪里开关!= 1大于Switch==1的行号,则这些行号的NewVar将更改为1。但我不太确定该怎么写
1条答案
按热度按时间ctehm74n1#
看起来您想要lged
Switch
的累积最大值,按ID分组,并保留前导NA
s。不幸的是,cummax
不处理NA
s,所以我们可以编写自己的版本: