前导向量根据另一个向量的未来值取值
Leading vector taking values based on future values of another vector
我有一系列的治疗,每天一次(二元),比如:
trt <- c(0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0)
我想新建一个向量,对应trt
的每一个元素,表示后面三个处理是否全为0。比如上面trt
的指示向量就是:
indicator <- c(0, 1, 1, 0, 0, 0, 1, 1, 1, NA, NA, NA)
例如第 3-5 天没有治疗(trt[3], trt[4], trt[5]
均为 0)因此第 2 天的指标应等于 1(indicator[2]
应为 1)
indicator
只有两个要求:
- 1如果接下来三天就不用治疗了
- 0 如果接下来的三天将至少进行一次治疗
- 除了它应该是 NA 如果还有 <3 天的观察时间
我如何在 R 中执行此操作?如果这在没有 for 循环的情况下可行,那将是理想的,但不是绝对必要的。
您可以使用zoo::rollsum
检查连续3天加起来是否为零。您还需要使用 dplyr::lead
来说明您正在查看 接下来 三天的事实。最后,您需要将结果逻辑向量转换为数值。
总之,这一切都归结为 one-liner(没有循环)
+(dplyr::lead(zoo::rollsum(trt, 3, fill = NA, align = "left")) == 0)
#> [1] 0 1 1 0 0 0 1 1 1 NA NA NA
这是一个基本的 R 选项
> +(rowSums(sapply(seq(3),function(k) `length<-`(trt[-(1:k)],length(trt)))==0)==3)
[1] 0 1 1 0 0 0 1 1 1 NA NA NA
我有一系列的治疗,每天一次(二元),比如:
trt <- c(0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0)
我想新建一个向量,对应trt
的每一个元素,表示后面三个处理是否全为0。比如上面trt
的指示向量就是:
indicator <- c(0, 1, 1, 0, 0, 0, 1, 1, 1, NA, NA, NA)
例如第 3-5 天没有治疗(trt[3], trt[4], trt[5]
均为 0)因此第 2 天的指标应等于 1(indicator[2]
应为 1)
indicator
只有两个要求:
- 1如果接下来三天就不用治疗了
- 0 如果接下来的三天将至少进行一次治疗
- 除了它应该是 NA 如果还有 <3 天的观察时间
我如何在 R 中执行此操作?如果这在没有 for 循环的情况下可行,那将是理想的,但不是绝对必要的。
您可以使用zoo::rollsum
检查连续3天加起来是否为零。您还需要使用 dplyr::lead
来说明您正在查看 接下来 三天的事实。最后,您需要将结果逻辑向量转换为数值。
总之,这一切都归结为 one-liner(没有循环)
+(dplyr::lead(zoo::rollsum(trt, 3, fill = NA, align = "left")) == 0)
#> [1] 0 1 1 0 0 0 1 1 1 NA NA NA
这是一个基本的 R 选项
> +(rowSums(sapply(seq(3),function(k) `length<-`(trt[-(1:k)],length(trt)))==0)==3)
[1] 0 1 1 0 0 0 1 1 1 NA NA NA