Как повернуть данные временных рядов, чтобы показать сумму / количество в месяц - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть набор данных, который содержит строку, идентифицирующую каждый раз, когда пациент испытывает симптом.Он включает в себя идентификатор, всеобъемлющую категорию симптомов (заболевание), возникший симптом и дату его появления.Я хотел бы повернуть эти данные, чтобы подсчитать, сколько раз каждый уникальный набор заболеваний / симптомов происходил в каждом данном месяце.Я уверен, что решение существует здесь, на StackOverflow, и я искал, но я не нашел ничего, что привело бы меня туда, где это должно быть.Я предоставил примерный набор данных, а также ожидаемый результат, очевидно созданный вручную.

id <- c(sprintf("A%03d", 1:3), sprintf("B%03d", 1:5))
c("disease", "symptom", "date")
x <- c(rep("bronchitis", 3), rep("flu", 5))
y <- c(rep("coughing", 2), "congestion", rep("fever", 3), "aches", "fatigue")
z <- as.factor(c("Jan 27, 2019", "Jan 26, 2019", "Dec 27, 2018", "Dec 03, 
2018", "Dec 18, 2018", "Nov 14, 2018", "Nov 21, 2018", "Jan 15, 2019"))
df <- data.frame("id" = id, "disease" = x, "symptom" = y, "date" = z)
df

a <- c(rep("bronchitis", 2), rep("flu", 3))
b <- c("cough", "congestion", "fever", "aches", "fatigue")
c <- c(0,0,1,1,0)
d <- c(0,1,2,0,0)
e <- c(2, 0, 0, 0, 1)
df2 <- data.frame("disease" = a, "symptom" = b, "Nov" = c, "Dec" = d, "Jan" = e)

df - исходный набор данных, df2 - ожидаемый результат

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Чтобы получить точный порядок дат, вы можете сделать:

df %>%
  count(disease,
        symptom,
        date = factor(format(as.Date(date, "%b%d,%Y"),"%b-%Y"),
                      levels = apply(expand.grid(month.abb, 1950:2050), 1, paste, collapse ="-"))) %>%
  spread(date, n, fill = 0)

Это будет соответствовать вашему желаемому результату, однако он будет содержать год в именах (как вы заказываете его из Novдо Jan, предлагая, чтобы год также играл роль в упорядочении и группировке):

# A tibble: 5 x 5
  disease    symptom    `Nov-2018` `Dec-2018` `Jan-2019`
  <fct>      <fct>           <dbl>      <dbl>      <dbl>
1 bronchitis congestion          0          1          0
2 bronchitis coughing            0          0          2
3 flu        aches               1          0          0
4 flu        fatigue             0          0          1
5 flu        fever               1          2          0

Если в именах столбцов не указан год, вы можете просто setNames в конце:

df %>%
  count(disease,
        symptom,
        date = factor(format(as.Date(date, "%b%d,%Y"),"%b-%Y"),
                      levels = apply(expand.grid(month.abb, 1950:2050), 1, paste, collapse ="-"))) %>%
  spread(date, n, fill = 0) %>%
  setNames(., sub("-.*", "", names(.)))

Выход:

# A tibble: 5 x 5
  disease    symptom      Nov   Dec   Jan
  <fct>      <fct>      <dbl> <dbl> <dbl>
1 bronchitis congestion     0     1     0
2 bronchitis coughing       0     0     2
3 flu        aches          1     0     0
4 flu        fatigue        0     0     1
5 flu        fever          1     2     0
0 голосов
/ 13 февраля 2019

Не точный порядок df2, но:

> df %>% 
  mutate(date = substr(df$date, 1, 3)) %>% 
  group_by(disease, symptom, date) %>% 
  count() %>% 
  spread(date, n, fill = 0)


   disease     symptom Dec Jan Nov 
bronchitis  congestion  1   0   0
bronchitis    coughing  0   2   0
       flu       aches  0   0   1
       flu     fatigue  0   1   0
       flu       fever  2   0   1
...