R语言 如何根据另一个变量的值创建一个滞后二进制变量,一旦组中的特定值出现,该变量的值就不会改变?

7gcisfzg  于 2023-09-27  发布在  其他
关注(0)|答案(1)|浏览(82)

我有这样的数据:

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。但我不太确定该怎么写

ctehm74n

ctehm74n1#

看起来您想要lged Switch的累积最大值,按ID分组,并保留前导NA s。不幸的是,cummax不处理NA s,所以我们可以编写自己的版本:

cummax_na = function(x, na.rm = TRUE) {
  if(!na.rm) return(cummax(x))
  if(all(is.na(x))) return(x)
  # check for leading NAs to keep
  first_non_na = match(TRUE, !is.na(x))
  x = dplyr::coalesce(x, -Inf)
  result = cummax(x)
  if(first_non_na > 1) result[1:(first_non_na - 1)] = NA
  result
}

dt = read.table(text = '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', header = T)

library(dplyr)
dt |> mutate(result = cummax_na(lag(Switch, 1, default = NA)), .by = ID)
#   ID visit Switch NewVar result
# 1  1     1      0     NA     NA
# 2  1     2      1      0      0
# 3  2     1      1     NA     NA
# 4  2     2      0      1      1
# 5  3     1     NA     NA     NA
# 6  3     2      1     NA     NA
# 7  3     3      0      1      1
# 8  3     4      0      1      1
# 9  4     1      1     NA     NA

相关问题