Накопленная сумма для каждой строки данных для одного и того же идентификатора - PullRequest
0 голосов
/ 29 марта 2020

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

df=data.frame(id=c(1,1,2,2,2,5,NA),var=c("a","a","b","b","b","e","f"),value=c(1,1,0,1,0,0,1),cs=c(2,2,3,3,3,3,NA))

Я хочу вычислить сумму значения для каждой группы (id, var), а затем накопительную сумму, но я хотел бы, чтобы накопленная сумма была отображается для каждой строки данных, т. е. я не хочу, чтобы сводный вид данных. Я включил, как должен выглядеть мой вывод. Это то, что я пробовал до сих пор:

df%>%arrange(id,var)%>%group_by(id,var)%>%mutate(cs=cumsum(value)) 

Есть предложения?

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Вот подход, который, я думаю, соответствует вашим ожиданиям.

Сгруппировал бы по id и вычислил бы сумму value для каждого id через summarise.

Затем вы можете добавить свой столбец накопленной суммы с mutate. Исходя из ваших комментариев, я включил ifelse, чтобы, если id было NA, это не обеспечило бы кумулятивную сумму, а вместо этого было дано NA.

Наконец, чтобы объединить ваше кумулятивное суммируя данные с исходным набором данных, вам необходимо объединить две таблицы.

library(tidyverse)

df %>%
  arrange(id) %>%
  group_by(id) %>%
  summarise(sum = sum(value)) %>%
  mutate(cs=ifelse(is.na(id), NA, cumsum(sum))) %>%
  left_join(df)

Вывод

# A tibble: 7 x 5
     id   sum    cs var   value
  <dbl> <dbl> <dbl> <fct> <dbl>
1     1     2     2 a         1
2     1     2     2 a         1
3     2     1     3 b         0
4     2     1     3 b         1
5     2     1     3 b         0
6     5     0     3 e         0
7    NA     1    NA f         1
1 голос
/ 29 марта 2020

Рассчитать совокупную сумму по всем значениям, даже если id равно NA, затем измените окончательное значение cs на NA, если id равно NA

df %>% 
  arrange(id, var) %>% 
  mutate(cs = cumsum(value)) %>%
  group_by(id, var) %>% 
  mutate(cs = max(ifelse(!is.na(id), cs, NA))) %>%
  ungroup() 

ИЛИ , исключить строки, где id равно NA при расчете кумулятивной суммы

df %>% 
  arrange(id, var) %>% 
  mutate(cs = cumsum(ifelse(!is.na(id), value, 0))) %>%
  group_by(id, var) %>% 
  mutate(cs = max(ifelse(!is.na(id), cs, NA))) %>%
  ungroup() 

Для ваших данных оба возвращают одинаковый результат

# A tibble: 7 x 4
#      id var   value    cs
#   <dbl> <fct> <dbl> <dbl>
# 1     1 a         1     2
# 2     1 a         1     2
# 3     2 b         0     3
# 4     2 b         1     3
# 5     2 b         0     3
# 6     5 e         0     3
# 7    NA f         1     4
...