Суммарная сумма, основанная на соответствующих последних значениях подгруппы - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть фрейм данных:

DF <- data.frame(Observation = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17),
                 ID          = c('A','A','B','C','D','D','B','B','B','B','A','A','A','B','D','D','C'),
                 Group       = c('X1','X2','X1','X1','X2','X2','X2','X1','X1','X2','X2','X2','X2','X1','X2','X1','X1'),
                 Value       = c(1,0,1,0,0,1,1,1,0,0,1,1,0,1,0,1,1))

Я бы хотел взять кумулятивную сумму по 'ID' (не сложно), но только на основе соответствующих последних значений 'Group', частью которой является каждый ID. Другими словами: для каждого «идентификатора» создайте кумулятивную сумму для всех последних доступных значений тех «групп», в которых присутствует идентификатор (может включать текущее значение в данной строке с учетом ссылки на последнее доступное значение).

Подробное объяснение: Пример для ID = A:

In (1) ID = A относится к X1 in (1) со значением = 1, приводит к cum_sum = 1.

In (2) ID = A относится к X1 in (1) со значением = 1 и X2 in (2) со значением = 0, приводит к cum_sum = 1.

In (11) ID = A относится к X1 in (1) со значением = 1 и X2 in (11) со значением = 1, приводит к cum_sum = 2.

In (12) ID = A относится к X1 in (1) со значением = 1 и X2 in (12) со значением = 1, приводит к cum_sum = 2.

In (13) ID = A относится к X1 in (1) со значением = 1 и X2 in (13) со значением = 0, приводит к cum_sum = 1.

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

DF_Result <- data.frame(Observation = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17),
                        ID          = c('A','A','B','C','D','D','B','B','B','B','A','A','A','B','D','D','C'),
                        Group       = c('X1','X2','X1','X1','X2','X2','X2','X1','X1','X2','X2','X2','X2','X1','X2','X1','X1'),
                        Value       = c(1,0,1,0,0,1,1,1,0,0,1,1,0,1,0,1,1),
                        Cum_Sum     = c(1,1,1,0,0,1,2,2,1,0,2,2,1,1,0,1,1))

Заранее большое спасибо.

Ответы [ 2 ]

3 голосов
/ 17 апреля 2019

Согласился с некоторыми другими в том, что объяснения немного сложны для понимания ... Но вот моя попытка: вы имеете в виду, что пытаетесь вычислить сумму для каждого идентификатора и совокупную последнюю для каждой группы? значение?

Если это так, вот реализация. Хитрость заключается в том, чтобы вычислить производную для каждого идентификатора и группы (например, diff()), и они принимают его cumsum() для идентификатора:

DF %>% 
  group_by(ID, Group) %>% 
  mutate(Diff = Value - lag(Value, default=0)) %>% 
  group_by(ID) %>% 
  mutate(Cum_Sum = cumsum(Diff))
1 голос
/ 17 апреля 2019

Я согласен с мнением, высказанным в комментариях, что это не ясно. Честно говоря (и я действительно не имею в виду это как оскорбление), это ужасное описание проблемы с двусмысленными / нестандартными терминами («см.») И запутанными объяснениями.

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

DF %>%
    group_by(ID) %>%
    mutate(
        n = 1:n(),
        Cum_Sum = if_else(n > 1, Value + first(Value), Value)) %>%
    select(-n)
## A tibble: 17 x 5
## Groups:   ID [4]
#   Observation ID    Group Value Cum_Sum
#         <dbl> <fct> <fct> <dbl>   <dbl>
# 1           1 A     X1        1       1
# 2           2 A     X2        0       1
# 3           3 B     X1        1       1
# 4           4 C     X1        0       0
# 5           5 D     X2        0       0
# 6           6 D     X2        1       1
# 7           7 B     X2        1       2
# 8           8 B     X1        1       2
# 9           9 B     X1        0       1
#10          10 B     X2        0       1
#11          11 A     X2        1       2
#12          12 A     X2        1       2
#13          13 A     X2        0       1
#14          14 B     X1        1       2
#15          15 D     X2        0       0
#16          16 D     X1        1       1
#17          17 C     X1        1       1

Я перевел ваше постановление задачи следующим образом: Cum_Sum - это сумма текущего Value и первого значения в этом Group; если текущее значение является первым значением, Cum_Sum является просто текущим Value.

Первые 9 строк идентичны ожидаемому результату; Я понятия не имею, почему Cum_Sum для строки 10 равно 0 ...


Обновление

Надеюсь, приблизимся к тому, что ты пытаешься сделать

DF %>%
    group_by(ID) %>%
    mutate(Cum_Sum = Value + lag(Value, default = 0))
## A tibble: 17 x 5
## Groups:   ID [4]
#   Observation ID    Group Value Cum_Sum
#         <dbl> <fct> <fct> <dbl>   <dbl>
# 1           1 A     X1        1       1
# 2           2 A     X2        0       1
# 3           3 B     X1        1       1
# 4           4 C     X1        0       0
# 5           5 D     X2        0       0
# 6           6 D     X2        1       1
# 7           7 B     X2        1       2
# 8           8 B     X1        1       2
# 9           9 B     X1        0       1
#10          10 B     X2        0       0
#11          11 A     X2        1       1
#12          12 A     X2        1       2
#13          13 A     X2        0       1
#14          14 B     X1        1       1
#15          15 D     X2        0       1
#16          16 D     X1        1       1
#17          17 C     X1        1       1

Если я правильно понял вашу «логику», это на самом деле не имеет ничего общего с накопленной суммой; вместо этого это просто

enter image description here

за ID.

Если вы хотите сделать это для ID и для Group, просто замените group_by(ID) на group_by(ID, Group).

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