r - 满足条件时,滞后向量加 1,同时重置为 0
问题描述
我有一系列的治疗,每天一次(二进制),说:
trt <- c(0, 0, 1, 0, 0, 0, 1, 0, 0)
我想创建一个向量,days_since
,它:
- 直到第一次治疗是NA。
- 是 0 哪里
trt
是 1 - 计算自上次治疗以来的天数
所以,输出days_since
应该是:
days_since <- c(NA, NA, 0, 1, 2, 3, 0, 1, 2)
我将如何在 R 中做到这一点?要获得days_since
,我基本上需要滞后一个元素并加 1,但每次原始向量 ( trt
) 为 1 时都会重置。如果这在没有 for 循环的情况下可行,那将是理想的,但不是绝对必要的。
解决方案
也许你可以试试下面的代码
v <- cumsum(trt)
replace(ave(trt,v,FUN = seq_along)-1,v<1,NA)
这使
[1] NA NA 0 1 2 3 0 1 2
解释
- 首先,我们申请
cumsum
对trt
治疗进行分组
> v <- cumsum(trt)
> v
[1] 0 0 1 1 1 1 2 2 2
- 其次,使用
ave
有助于在每个组内添加顺序索引
> ave(trt,v,FUN = seq_along)-1
[1] 0 1 0 1 2 3 0 1 2
- 最后,由于该值是
NA
在第一次处理之前,这意味着之前v == 1
出现的所有值都应该替换为NA
。因此我们使用replace
,并且索引逻辑如下v < 1
> replace(ave(trt,v,FUN = seq_along)-1,v<1,NA)
[1] NA NA 0 1 2 3 0 1 2
推荐阅读
- node.js - 通过单击按钮调用 POST 方法
- node.js - rollup包axios,不能用
- java - 使用 100 个元素多次打印数组中的每 10 个元素
- c# - 如何在c#中取消绑定复选框列表或删除复选框列表项。?
- arrays - 如何加入 Json 响应元素
- python - 匹配数据帧之间的部分表达式
- java - 在java中分配给0的位数是0-为什么?
- c# - EWS 在 WellKnownFolderName.SentItems 中保存已发送的项目
- azure-data-factory - 列名中带有 @ 的 Azure 数据工厂数据集
- java - Hibernate:在 SQLIntegrityConstraintViolationException 之后生成的 Id 保留在非持久实体中