Пользовательский видоизменять новый столбец на основе двух других столбцов в R с помощью dplyr - PullRequest
2 голосов
/ 03 марта 2020

Моя цель - создать новый столбец df, значения которого основаны на двух других столбцах. Мой набор данных касается набора в исследование. Я бы хотел колонку, которая определяет, был ли человек в определенном раунде исследования, если это было его первое участие, его второе, третье и так далее (до 8 раундов). В настоящее время я пытаюсь сделать это с помощью mutate(case_when)) в dplyr и использовать lag(). Однако, это работает неправильно, если человек пропустил этап исследования и позже вернулся в него. Набор данных выглядит следующим образом:

    person |  round  |  in_round  |
       A        1           1
       A        2           1
       A        3           1
       A        4           1
       A        5           1
       A        6           0
       A        7           0
       A        8           0
       B        1           0
       B        2           0
       B        3           1
       B        4           1
       B        5           1
       B        6           1
       B        7           0
       B        8           1

Мне нужен отдельный столбец, который использует round и in_round для каждого человека для получения следующего:

    person |  round  |  in_round  |  round_status
       A        1           1         recruited
       A        2           1        follow_up_1
       A        3           1        follow_up_2
       A        4           1        follow_up_3
       A        5           1        follow_up_4
       A        6           0           none
       A        7           0           none
       A        8           0           none
       B        1           0           none
       B        2           0           none
       B        3           1         recruited
       B        4           1        follow_up_1
       B        5           1        follow_up_2
       B        6           1        follow_up_3
       B        7           0            none
       B        8           1        follow_up_4

In резюме:

  • где in_round == 0, round_status == "none"
  • в первый раз in_round == 1, round_status == "recruited"
  • последующие времена in_round == 1, round_status == "follow_up_X" (зависит от количества предыдущих волн, в которых присутствовал индивидуум).

1 Ответ

2 голосов
/ 03 марта 2020

Попробуйте это:

df %>% 
  group_by(person) %>%
  arrange(round) %>%
  mutate(cum_round = cumsum(in_round),
         round_status = case_when(
    in_round == 0 ~ "none",
    cum_round == 1 ~ "recruited",
    TRUE ~ paste0("follow_up_", cum_round - 1)
  ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...