Как построить текущий накопленный итог из отдельных записей в R? - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть набор данных, куда разные города входят и выходят из программы, как этот пример набора данных:

example.dat <- data.frame (c(1000, 2000, 3000), c("15-10-01", "16-05-01", "16-07-01"), c("16-06-01", "16-10-01", "17-08-01"))
colnames(example.dat) <- c("Population", "Enter.Program", "Leave.Program")

Это дает вам фрейм данных, который выглядит как:

Population  Enter.Program Leave.Program
1000        15-10-01      16-06-01
2000        16-05-01      16-10-01
3000        16-07-01      17-08-01

Во-первых, я хотел бы создать выходную таблицу следующим образом:

Per.Begin   Per.End     Total.Pop.In
15-10-01    16-04-30    1000
16-05-01    16-05-30    3000
16-06-01    16-06-30    2000
16-07-01    16-09-30    5000
16-10-01    17-07-30    3000
17-08-01    18-04-26    0 

А затем нарисуйте это в ggplot как график, который выглядит как ступенчатая функция или как зубчатая прямоугольная поверхность, где верхний край - это промежуточный итог, что-то вроде накопительной функции плотности, но где ось y может идти вниз, а также вверх, и там, где ось х идет с шагом, равным ширине периодов времени.

Вот шаги, которые я заблокировал, но я не знаю, как их выполнить:

  1. Сделать столбец уникальных дат
  2. Сделать столбец дат окончания изменения периода (т. Е. Следующей уникальной даты минус один день)
  3. Рассчитать промежуточную сумму городов за каждый период (т. Е. Третий столбец)
  4. Участок в ggplot

1 Ответ

0 голосов
/ 26 апреля 2018

Используя dplyr (потому что вы пометили вопрос с ним), вы можете делать то, что вы хотите. Основные вещи, которые должны произойти:

  1. Разбейте ваши входы и выходы, делая ваше население положительным и отрицательным.
  2. Получите все даты от самых ранних до последних, чтобы вы могли иметь желаемые блокированные строки. Возможно, это можно сделать без всякой даты, но это легко и требует меньше размышлений.

Код ниже

library(dplyr)
library(ggplot2)

example.dat <- data.frame (c(1000, 2000, 3000), c("15-10-01", "16-05-01", "16-07-01"), c("16-06-01", "16-10-01", "17-08-01"))
colnames(example.dat) <- c("Population", "Enter.Program", "Leave.Program")

changes = example.dat %>% 
  select("Population","Date"="Enter.Program") %>% 
  bind_rows(example.dat %>% 
              select("Population","Date"="Leave.Program") %>% 
              mutate(Population = -1*Population)) %>% 
  mutate(Date = as.Date(Date,"%y-%m-%d"))

startDate = min(changes$Date)
endDate = max(changes$Date)
final = data_frame(Date = seq(startDate,endDate,1)) %>% 
  left_join(changes,by="Date") %>% 
  mutate(Population = cumsum(ifelse(is.na(Population),0,Population)))

ggplot(data = final,aes(x=Date,y=Population)) +
  geom_line()

UPDATE

Если вы не хотите, чтобы каждая дата была самой ранней или последней, вы можете использовать цикл blurgh for, чтобы добавить необходимые строки, чтобы получить красивый результат. Здесь мы проходим и дублируем каждую дату после первой с предыдущей накопленной суммой. Это не красиво, но это делает график.

library(dplyr)
library(ggplot2)

example.dat <- data.frame (c(1000, 2000, 3000), c("15-10-01", "16-05-01", "16-07-01"), c("16-06-01", "16-10-01", "17-08-01"))
colnames(example.dat) <- c("Population", "Enter.Program", "Leave.Program")

changes = example.dat %>% 
  select("Population","Date"="Enter.Program") %>% 
  bind_rows(example.dat %>% 
              select("Population","Date"="Leave.Program") %>% 
              mutate(Population = -1*Population)) %>% 
  mutate(Date = as.Date(Date,"%y-%m-%d")) %>% 
  arrange(Date) %>% 
  mutate(Population = cumsum(Population))

for(i in nrow(changes):2){
  changes = bind_rows(changes[1:(i-1),],
            data_frame(Population = changes$Population[i-1],Date = changes$Date[i]),
            changes[i:nrow(changes),])
}

ggplot(data = changes,aes(x=Date,y=Population)) +
  geom_line()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...