Последовательный порядок по группе И, когда условие выполняется в R - PullRequest
1 голос
/ 12 февраля 2020

Вот мой фрейм данных:

    df <- data.frame(id=c("124", "124", "124", "456", "456", "456", "456", "8675", "8675", "8675", "8675", "8675", "124", "124", "124", "124"), 
            condition=c("beg", "mid", "end", "beg", "mid", "mid", "end", "beg", "mid", "mid", "mid", "end", "beg", "mid", "mid", "end"),
            school=c("a", "b", "c", "d", "e", "e", "f", "g", "h", "h", "h", "u", "j", "k", "k", "l"),
            start_date=c("20000105", "20000601", "20000901", "20000105", "20000601", "20000620", "20000901", "19990805", "20000105", "20000601", "20000901", "20010115", "20060105", "20060701", "20061001", "20070110"),
            end_date=c("20000501", "20000801", "20001215", "20000501", "20000801", "20001210", "20001215", "19991213", "20000501", "20000801", "20001215", "20010515", "20060501", "20060915", "20061215", "20070510"))

Многие из вопросов, которые я видел, либо заказывают внутри группы:

df_edited <- df  %>% 
         group_by(id, idx = cumsum(seq == 1L)) %>% 
         mutate(counter = row_number()) %>% 
         ungroup %>% 
         select(-idx)

, либо перезапускают через 1 после выполнения условия.

df_edited$num <- ave(df_edited$id, df_edited$condition, FUN = seq_along)

Я отметил их как избранные, но они не применимы к тому, что я хочу сделать прямо сейчас. Что бы я хотел, чтобы номер группы был таким же на id и менялся после df$condition=="end"

id      condition   school  start_date  end_date    group
124     beg         a       20000105    20000501    1
124     mid         b       20000601    20000801    1
124     end         c       20000901    20001215    1
456     beg         d       20000105    20000501    2
456     mid         e       20000601    20000801    2
456     mid         e       20000620    20001210    2
456     end         f       20000901    20001215    2
8675    beg         g       19990805    19991213    3
8675    mid         h       20000105    20000501    3
8675    mid         h       20000601    20000801    3
8675    mid         h       20000901    20001215    3
8675    end         h       20010115    20010515    3
124     beg         j       20060105    20060501    4
124     mid         k       20060701    20060915    4
124     mid         k       20061001    20061215    4
124     end         l       20070110    20070510    4

Может ли кто-нибудь помочь? Спасибо!

Каждый идентификатор может go через начало, середину, конец несколько раз, но я все равно хотел бы, чтобы номер группы был другим, даже если идентификатор один и тот же.

1 Ответ

1 голос
/ 12 февраля 2020

Если нам нужен групповой индекс, тогда используйте rleid

library(dplyr)
library(data.table)
df %>%
   mutate(group = rleid(id))
#      id condition school start_date end_date group
#1   124       beg      a   20000105 20000501     1
#2   124       mid      b   20000601 20000801     1
#3   124       end      c   20000901 20001215     1
#4   456       beg      d   20000105 20000501     2
#5   456       mid      e   20000601 20000801     2
#6   456       mid      e   20000620 20001210     2
#7   456       end      f   20000901 20001215     2
#8  8675       beg      g   19990805 19991213     3
#9  8675       mid      h   20000105 20000501     3
#10 8675       mid      h   20000601 20000801     3
#11 8675       mid      h   20000901 20001215     3
#12 8675       end      u   20010115 20010515     3
#13  124       beg      j   20060105 20060501     4
#14  124       mid      k   20060701 20060915     4
#15  124       mid      k   20061001 20061215     4
#16  124       end      l   20070110 20070510     4

Или в base R

df$group <-   with(rle(df$id), rep(seq_along(values), lengths))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...