Продолжение моего предыдущего вопроса
Создание групп на основе промежуточных итогов по значению
Предыдущая проблема: «У меня есть данные, которые уникальны для одной переменной Y. Другая переменная Z сообщает мне, сколько человек в каждом из Y. Моя проблема в том, что я хочу создать группы из 45 из этих Y и Z. I означает, что всякий раз, когда итоговая сумма Z достигает 45, создается одна группа, и код переходит к созданию следующей группы "
Расширение проблемы: Что если, переменная X
, которая A
только сейчас, также меняется. Например, это может быть B
на некоторое время, а затем может быть C
. Как я могу предотвратить генерирование кода группами, которые не входят в две категории X
. Например, если Group = 3
, то как я могу убедиться, что 3 не относится к категории A
и B
?
Ранее я использовал два ответа от @ tmfmnk
df %>%
mutate(Cumsum = accumulate(Z, ~ if_else(.x >= 45, .y, .x + .y)),
Group = cumsum(Cumsum >= 45),
Group = if_else(Group > lag(Group, default = first(Group)), lag(Group), Group) + 1)
и @G. Гротендик
Accum <- function(acc, x) if (acc < 45) acc + x else x
r <- Reduce(Accum, DF$Z, accumulate = TRUE)
g <- rev(cumsum(rev(r) >= 45))
g <- max(g) - g + 1
transform(DF, Cumsum = r, Group = g)
Оба кода могут решить эту первую проблему.
Мои данные выглядят так
I have data which is unique at one variable Y. Another variable Z tells me how many people are in each of Y. My problem is that I want to create groups of 45 from these Y and Z. I mean that whenever the running total of Z touches 45, one group is made and the code moves on to create the next group.
My data looks something like this
ID X Y Z
1 A A 1
2 A B 5
3 A C 2
4 A D 42
5 A E 10
6 A F 2
7 A G 0
8 A H 3
9 A I 0
10 A J 8
11 A K 19
12 B L 4
13 B M 1
14 B N 1
15 B O 2
16 B P 0
17 B Q 1
18 B R 2
Я хочу что-то вроде этого
ID X Y Z CumSum Group
1 A A 1 1 1
2 A B 5 6 1
3 A C 2 8 1
4 A D 42 50 1
5 A E 10 10 2
6 A F 2 12 2
7 A G 0 12 2
8 A H 3 15 2
9 A I 0 15 2
10 A J 8 23 2
11 A K 19 42 2
12 B L 3 3 3
13 B M 1 4 3
14 B N 1 5 3
15 B O 2 7 3
16 B P 0 7 3
17 B Q 1 8 3
18 B R 2 9 3
Пожалуйста, дайте мне знать, что можно сделать.