【问题标题】:How to convert daily values into monthly for R如何将每日值转换为 R 的每月值
【发布时间】:2019-08-22 15:03:39
【问题描述】:

所以我有一个包含日期和住院人数的数据。数据是两年的每一天。数据看起来有点像这样:

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. 

您能否更详细地解释一下这些背后的逻辑。

谢谢

【问题讨论】:

标签: r statistics time-series


【解决方案1】:

添加年/月或年列并按此聚合:

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)

更新

固定。

【讨论】:

    【解决方案2】:

    您可以使用dplyrlubridate,如下图所示:

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

    如果你想分成冬天和夏天,那么你可以mutate另一个字段season通过提取month并在group_by(year, season)中使用它

    【讨论】:

      【解决方案3】:

      这是一个 tidyverse 解决方案:

      library(dplyr)
      library(lubridate)
      
      summary <- data %>%
          mutate(month = month(Date),
                 year = year(Date)) %>%
          group_by(month, year) %>%
          summarise(cvdadmission = sum(cvdadmission),
                    respiratoryadmission = sum(respiratoryadmission)
      

      【讨论】:

      • 感谢您的解释,但我仍然不明白。我正在编辑问题以获取更多详细信息。谢谢
      • 在上面的公式中说日期的地方是指列。无需输入具体日期。它所做的是创建一个名为月的新列,它是您的日期列中每个日期的月份,并且与年份相同。然后我们告诉它按这两列分组,有效地删除日期的日期部分。将其视为 Excel 中的数据透视表。我们将年和月放在行值中,并将 cvdadmission 和 respiratoryadmission 的总和放在值中。
      • 我的数据中已经有月份和年份列。因此,在这种情况下,公式中将省略 mutate。我应该从 summary% 开始并删除变异并保留公式的其余部分。你能推荐我一些youtube教程吗?我一直在寻找合适的,但找不到。
      【解决方案4】:

      在基础 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))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-20
        • 2020-07-22
        • 2021-02-13
        • 1970-01-01
        • 1970-01-01
        • 2022-06-30
        • 2015-10-31
        • 1970-01-01
        相关资源
        最近更新 更多