Как перевести дневные значения в месячные для R - PullRequest
0 голосов
/ 01 апреля 2019

Итак, у меня есть данные с датами и госпитализацией. данные на каждый день за два года. Данные выглядят примерно так:

Date        cardioadmission   respiratoryadmission
2001-01-01        12                   06
2001-01-02        10                   5
2001-01-03        08                   4
2001-01-04        04                   6

Я хочу составить таблицу результатов, подобную этой

year    cvdadmissions   respiratoryadmissions

Итак, я хочу агрегировать даты по годам, а затем делить год на лето и зиму. Допустим, я хочу, чтобы результаты выглядели так:

year         cvdadmissions   respiratoryadmissions
2001            21                 22

поэтому я хочу сообщать о поступлении по месяцам, а не по дням. какая-то совокупная вещь. Может кто-нибудь, пожалуйста, сообщите мне об этом

обновление:

summary <- data %>%
mutate(month = month(Date),  # what should i write in month and also in 
date
year = year(Date)) %>%  #same here what should i write in year and 
year(date)
group_by(month, year) %>%   # which month and by year which year. 
summarise(cvdadmission = sum(cvdadmission),
respiratoryadmission = sum(respiratoryadmission) # i have understood this part. 

Не могли бы вы объяснить логику, стоящую за ними, немного подробнее.

Спасибо

Ответы [ 4 ]

0 голосов
/ 01 апреля 2019

В базе R вы можете использовать format добавить столбец года

df$Year <- format(as.Date(df$Date), "%Y")
#         Date cardioadmission respiratoryadmission Year
# 1 2001-01-01              12                    6 2001
# 2 2001-01-02              10                    5 2001
# 3 2001-01-03               8                    4 2001
# 4 2001-01-04               4                    6 2001

Затем вы можете приступить к анализу.Вот альтернатива предоставленным подходам, используя vapply

t(vapply(unique(df$Year), function(y) {
  i <- .subset2(df, ncol(df)) == y
  c(cardioadmission = sum(.subset2(df, 2L)), respiratoryadmission = sum(.subset2(df, 3L)))
}, numeric(2)))
#      cardioadmission respiratoryadmission
# 2001              34                   21 

Данные

df <- structure(list(Date = structure(1:4, .Label = c("2001-01-01", 
                                                      "2001-01-02", "2001-01-03", "2001-01-04"), class = "factor"), 
                     cardioadmission = c(12, 10, 8, 4), respiratoryadmission = c(6, 
                                                                                 5, 4, 6)), class = "data.frame", row.names = c(NA, -4L))
0 голосов
/ 01 апреля 2019

Вы можете использовать dplyr и lubridate, как показано ниже:

library(dplyr)
library(lubridate)
df %>%
  mutate(year = year(Date)) %>%
  summarise(cvdadmissions = sum(cardioadmission),
            respiratoryadmissions = sum(respiratoryadmission))

Если вы хотите разделить на зиму и лето, тогда вы можете mutate другое поле season, извлекая month и использовать это в group_by(year, season)

0 голосов
/ 01 апреля 2019

Вот решение по делу:

library(dplyr)
library(lubridate)

summary <- data %>%
    mutate(month = month(Date),
           year = year(Date)) %>%
    group_by(month, year) %>%
    summarise(cvdadmission = sum(cvdadmission),
              respiratoryadmission = sum(respiratoryadmission)
0 голосов
/ 01 апреля 2019

Добавьте столбец год / месяц или год и агрегируйте таким образом:

library(zoo)

DFym <- transform(DF0, YearMon = as.yearmon(Date))[-1]
aggregate(. ~ YearMon, DFym, sum)
##    YearMon  cardioadmission respiratoryadmission
## 1 Jan 2001               34                   21

DFy <- transform(DF0, Year = as.integer(as.yearmon(Date)))[-1]
aggregate(. ~ Year, DFy, sum)
##   Year  cardioadmission respiratoryadmission
## 1 2001               34                   21

Другой подход заключается в представлении DF0 в виде временного ряда зоопарка:

library(zoo)

z <- read.zoo(DF0)

aggregate(z, as.yearmon, sum)
##          cardioadmission respiratoryadmission
## Jan 2001              34                   21

aggregate(z, function(x) as.integer(as.yearmon(x)), sum)
##      cardioadmission respiratoryadmission
## 2001              34                   21

Примечание

Lines <- "Date        cardioadmission   respiratoryadmission
2001-01-01        12                   06
2001-01-02        10                   5
2001-01-03        08                   4
2001-01-04        04                   6"
DF0 <- read.table(text = Lines, header = TRUE)
DF0$Date <- as.Date(DF0$Date)

Обновление

Исправлено.

...