我在R中工作,我想为治疗可以为个人打开和关闭的情况创建一个相对时间索引.因此,当治疗变为1时,索引将从某个负数向上计数直到0,并且只要在重置之前治疗保持在1,索引将向上计数.用一个例子来解释我需要什么是最简单的.

假设我有如下数据:

df <- data.frame(id = c(1,1,1,1,1,1,1,1,1,1,1,2,2,2,2), treatment = c(0,0,1,1,0,0,0,1,1,1,0,0,1,1,1))

我想要取得以下结果:

  id treatment relative_time
1     1         0            -2
2     1         0            -1
3     1         1             0
4     1         1             1
5     1         0            -3
6     1         0            -2
7     1         0            -1
8     1         1             0
9     1         1             1
10    1         1             2
11    1         0             .
12    2         0            -1
13    2         1             0
14    2         1             1
15    2         1             2

我已经看到以下代码适用于每个人只进行一次治疗的情况,但遗憾的是,我无法找到一种方法来使其适应我的情况:

df  %>%
  group_by(id) %>%
  mutate(relative_time = seq_along(treatment) - which(treatment %in% 1))

如有任何帮助,我们将不胜感激!

推荐答案

您可以使用dplyr库首先创建一个新的分组变量,使用cumsum()来检测值的变化,然后在处理为1时对每个组进行0,1,2...(n-1)排序,当处理为0时对每个组进行排序-n+0, -n+1, ... -1

library(dplyr)

df %>%
  mutate(
    g = cumsum(treatment != lag(treatment, default = TRUE)),
    .by = id
  ) |>
  mutate(
    relative_time = seq_along(g) - 1 + ifelse(treatment, 0,  -length(g)),
    .by = c(id, g)
  ) |>
  select(-g)

输出

id treatment relative_time
1   1         0            -2
2   1         0            -1
3   1         1             0
4   1         1             1
5   1         0            -3
6   1         0            -2
7   1         0            -1
8   1         1             0
9   1         1             1
10  1         1             2
11  1         0            -1
12  2         0            -1
13  2         1             0
14  2         1             1
15  2         1             2

R相关问答推荐

过滤矩阵以获得R中的唯一组合

如何使用R中的dhrr函数将李克特量表的因子列从长转换为宽?

判断字符串中数字的连续性

如何在RMarkdown LaTex PDF输出中包含英语和阿拉伯语?

如何写一个R函数来旋转最后n分钟?

将嵌套列表子集化为嵌套列表

当我们有多个特殊字符时,使用gsub删除名称和代码'

SHINY:使用JS函数应用的CSS样式显示HTML表格

汇总数据帧中的复制列,保持行的唯一性

R中的类别比较

如何使用FormC使简单算术运算得到的数字是正确的?

使用geom_sf跨越日期线时的闭合边界

主题(Legend.key=Element_RECT(Fill=&Quot;White&Quot;))不起作用

如何使用ggplot2根据绘图中生成的斜率对小平面进行排序?

Broom.Mixed::Augment不适用于Sample::分析

在鼠标悬停时使用Plotly更改geom_point大小

从单个html段落中提取键-值对

如何在一个GGPLATE中绘制多个灰度平滑?

Data.table条件合并

如何在给定的环境中找到函数的函数参数?