我有以下问题但找不到答案:
我有一个看起来像这样的 df:
id x1_t1 x1_t2 x1_t3 y1_t1 y1_t2 y1_t3
1 1 0 0 0 100 110 150
2 2 0 0 1 150 140 180
3 3 0 1 1 90 150 160
x1 和 y1 处于其多个时间(不同时间点)。根据 x1 变量从 0 变为 1 的时间,我想要相应的 y1 值,以便生成的数据帧如下所示:
id y1_before y1_after
1 1 110 150
2 2 140 180
3 3 90 150
我已经用 dplyr 搞乱了很多,但还没有找到有效的解决方案。也许你可以给我一个主意。预先感谢!!
这很长,我想看看人们能想出什么更短的方法。
要在 dplyr 中执行此操作,我认为重塑数据是最简单的。我使用pivot_longer和pivot_wider分两步完成此操作,但我认为这可能可以使用pivot_longer_spec一步完成。
然后我计算每个 id 中有多少个 x1==1,删除第二个“1”的任何观察结果(如 id3 中的 t3)。然后我在每个 id 中获取最后两个剩余的观察结果。
最后,使用自定义名称再次扩大范围。
library(tidyverse)
df |>
pivot_longer(-id, names_to = c("class", "time"), names_sep = "_") |>
pivot_wider(names_from = class, values_from = value) |>
filter(cumsum(x1) <= 1, .by = id) |>
slice_tail(n = 2, by = id) |>
mutate(time = if_else(row_number() == 1, "before", "after"), .by = id) |>
select(-x1) |>
pivot_wider(names_from = time, names_glue = "y1_{time}", values_from = y1)
结果
id y1_before y1_after
<int> <int> <int>
1 1 110 150
2 2 140 180
3 3 90 150