R 中的数据帧操作 - 选择某些值

问题描述 投票:0回答:1

我有以下问题但找不到答案:

我有一个看起来像这样的 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 搞乱了很多,但还没有找到有效的解决方案。也许你可以给我一个主意。预先感谢!!

r dataframe dplyr data-manipulation
1个回答
0
投票

这很长,我想看看人们能想出什么更短的方法。

要在 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
© www.soinside.com 2019 - 2024. All rights reserved.