【问题标题】:Leading vector taking values based on future values of another vector前导向量取值基于另一个向量的未来值
【发布时间】:2020-09-29 19:42:19
【问题描述】:

我有一系列的治疗,每天一次(二进制),比如说:

trt <- c(0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0)

我要新建一个向量,对应trt的每个元素,表示NEXT三个处理是否全为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 如果接下来的三天将至少接受一次治疗
  • 如果还有

我将如何在 R 中做到这一点?如果这在没有 for 循环的情况下是可行的,那将是理想的,但不是绝对必要的。

【问题讨论】:

标签: r vector lag lead


【解决方案1】:

您可以使用zoo::rollsum 来检查连续 3 天是否加到零。您还需要使用dplyr::lead 来说明您正在查看下一个 三天的事实。最后,您需要将生成的逻辑向量转换为数值。

无论如何,这一切都归结为这个单行(没有循环)

+(dplyr::lead(zoo::rollsum(trt, 3, fill = NA, align = "left")) == 0)
#> [1]  0  1  1  0  0  0  1  1  1 NA NA NA

【讨论】:

  • 所以可以使用+TRUEFALSE 转换为10 吗?可以在管道中使用它吗?只是好奇
  • @Ivn Ant 是的。试试TRUE %>% '+'(在“+”周围使用反引号),你会得到 1
  • 不错的解决方案,简单高效! +1
【解决方案2】:

这是一个基本的 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

【讨论】:

  • 感谢您分享 base-R 版本!很高兴知道
猜你喜欢
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 1970-01-01
  • 2018-01-06
  • 2015-01-02
  • 1970-01-01
相关资源
最近更新 更多