#r #longitudinal
Вопрос:
У меня есть данные, которые расположены слева в этой таблице, но я хочу сгенерировать данные справа:
ID | A | —> | ID | A | B |
---|---|---|---|---|---|
1 | 0 | 1 | 0 | 0 | |
1 | 0 | 1 | 0 | 0 | |
1 | 1 | 1 | 1 | 1 | |
1 | 0 | 1 | 0 | 1 | |
2 | 0 | 2 | 0 | 0 | |
2 | 1 | 2 | 1 | 1 | |
2 | 0 | 2 | 0 | 1 | |
2 | 0 | 2 | 0 | 1 | |
2 | 0 | 2 | 0 | 1 |
Я хочу сгенерировать столбец B, который равен 0 до первого появления 1 в столбце A, а затем заполнить текущие наблюдения 1 из этого первого наблюдения в A по идентификатору. Я даже не знаю, с чего начать. Если кто-нибудь может помочь, я был бы признателен
Ответ №1:
library(tidyverse)
df <-
structure(list(
ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L),
A = c(0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 0L)
),
class = "data.frame",
row.names = c(NA,-9L))
df %>%
group_by(ID) %>%
mutate(B = cummax(A)) %>%
ungroup()
#> # A tibble: 9 x 3
#> ID A B
#> <int> <int> <int>
#> 1 1 0 0
#> 2 1 0 0
#> 3 1 1 1
#> 4 1 0 1
#> 5 2 0 0
#> 6 2 1 1
#> 7 2 0 1
#> 8 2 0 1
#> 9 2 0 1
Создано 2021-09-28 пакетом reprex (v2.0.1)
Комментарии:
1. Это сработало, спасибо!
2. Отлично! Если вы считаете, что этот ответ был полезен для вас, вы можете принять его, щелкнув галочку в левой части этого ответа 🙂
Ответ №2:
Может быть, мы сможем попробовать
transform(
df,
B = ave(A==1, ID, FUN = cumsum)
)