Отметить первое вхождение числа и все строки после - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть df в R, который отслеживает статус, независимо от того, является ли человек одиноким (0), женатым (1) или разведенным (99) сверхурочным.

ID <- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 5)
STATUS <- c("0", "0", "0", "1", "1", "1", "99", "99", "1", "0", "1")
df <- data.frame(ID, STATUS)
df

Я хотел бы создать новую переменную, которая будет отмечать первый раз, когда человек разведен (STATUS = 99), и любые строки после этой точки.Например, в столбце STATUS идентификатор 1 был один для трех периодов, затем был разведен для столбца трех периодов, а затем снова женился.Столбец «flag» отмечает первые 99, которые появляются, и все события после этой строки для каждого ID.

. Конечный продукт должен выглядеть следующим образом:

  ID STATUS    FLAG
   1      0      0
   1      0      0
   1      0      0
   1      1      0
   1      1      0
   1      1      0
   1     99      1
   1     99      1
   1      1      1
   5      0      0
   5      1      0

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Одна возможность, используя dplyr:

df %>%
 group_by(ID) %>%
 mutate(flag = ifelse(row_number() >= min(which(STATUS == 99)), 1, 0))

      ID STATUS  flag
   <dbl> <fct>  <dbl>
 1    1. 0         0.
 2    1. 0         0.
 3    1. 0         0.
 4    1. 1         0.
 5    1. 1         0.
 6    1. 1         0.
 7    1. 99        1.
 8    1. 99        1.
 9    1. 1         1.
10    5. 0         0.
11    5. 1         0.

Или с dplyr и tidyr:

df %>%
 group_by(ID) %>%
 mutate(flag = ifelse(STATUS != 99, NA, 1)) %>%
 fill(flag) %>%
 mutate(flag = replace_na(flag, 0))

Или что @markus сделал в dplyr:

df %>%
 group_by(ID) %>%
 mutate(flag = cummax(STATUS == 99))

Или с основанием R:

df$flag <- ave(df$STATUS, df$ID, FUN = function(x) ifelse(1:nrow(df) >= min(which(x == 99)), 1, 0))

   ID STATUS flag
1   1      0    0
2   1      0    0
3   1      0    0
4   1      1    0
5   1      1    0
6   1      1    0
7   1     99    1
8   1     99    1
9   1      1    1
10  5      0    0
11  5      1    0
0 голосов
/ 11 февраля 2019

Мы можем использовать cummax по группе

df$FLAG <- with(df, ave(STATUS, ID, FUN = function(x) cummax(x == 99)))
df
#   ID STATUS FLAG
#1   1      0    0
#2   1      0    0
#3   1      0    0
#4   1      1    0
#5   1      1    0
#6   1      1    0
#7   1     99    1
#8   1     99    1
#9   1      1    1
#10  5      0    0
#11  5      1    0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...