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

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

group <- c(rep("A", 8), rep("B", 8))
x1 <- c(rep(0, 3), rep(1, 3), rep(0, 2))
x2 <- rep(0:1, 4)

df <- data.frame(group=group, indic=c(x1, x2))

Вот результирующий фрейм данных:

 df
   group indic
1      A     0
2      A     0
3      A     0
4      A     1
5      A     1
6      A     1
7      A     0
8      A     0
9      B     0
10     B     1
11     B     0
12     B     1
13     B     0
14     B     1
15     B     0
16     B     1

indic==1 означает, что строка является началом новой подгруппы, а подгруппа должна быть пронумерована 1 выше, чем в предыдущей подгруппе. Где indic==0 подгруппа должна быть такой же, как и предыдущая подгруппа. Нумерация подгрупп начинается с 1. Когда переменная group изменяется, нумерация подгрупп сбрасывается на 1. Я хотел бы использовать механизм Tidyverse. Вот результат, который я хочу получить:

 df
   group indic subgroup
1      A     0        1
2      A     0        1
3      A     0        1
4      A     1        2
5      A     1        3
6      A     1        4
7      A     0        4
8      A     0        4
9      B     0        1
10     B     1        2
11     B     0        2
12     B     1        3
13     B     0        3
14     B     1        4
15     B     0        4
16     B     1        5

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

1 Ответ

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

Вы можете просто использовать

library(dplyr)
df %>% group_by(group) %>% 
  mutate(subgroup=cumsum(indic)+1)
#   group indic subgroup
#   <fct> <dbl>    <dbl>
#  1 A         0        1
#  2 A         0        1
#  3 A         0        1
#  4 A         1        2
#  5 A         1        3
#  6 A         1        4
#  7 A         0        4
#  8 A         0        4
#  9 B         0        1
# 10 B         1        2
# 11 B         0        2
# 12 B         1        3
# 13 B         0        3
# 14 B         1        4
# 15 B         0        4
# 16 B         1        5

Мы используем dplyr, чтобы выполнить группировку, а затем мы просто используем cumsum с, получая кумулятивную сумму столбца indic, поэтому каждый раз, когда он видит 1 увеличивается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...