首页 > 解决方案 > 在特定时间范围内建立平均值

问题描述

以下问题让我非常头疼。

我有一个看起来像这样的大数据集。

Name   Date         C1   C2    C3    C4    C5    C6   C7
 A     2008-01-03   100
 A     2008-01-05   NA
 A     2008-01-07   120
 A     2008-02-03   NA
 A     2008-03-10   50
 A     2008-07-14   70
 A     2008-07-15   NA
 A     2009-01-03   40
 A     2009-01-05   NA
 A     2010-01-07   NA
 A     2010-03-03   30
 A     2010-03-10   20
 A     2011-07-14   10
 A     2011-07-15   NA
 B     2008-01-03   NA
 B     2008-01-05   5
 B     2008-01-07   3
 B     2008-02-03   11
 B     2008-03-10   13
 B     2008-07-14   ....

如您所见,我的观察中有很多 NA。其他列看起来相似,数据集有 +100.000 行。所以它很大。

我想要做的是,我想通过以下方式聚合我的数据。例如 C1:我想在从 2000 年 1 月到 2012 年 12 月的时间范围内为每个名称以及每年和每个月建立每月平均值。

应使用每个月的可用日期计算月平均值。

计算完成后,我的数据集应如下所示。

Name   Date         C1          C2    C3    C4    C5    C6   C7
 A     2008-01  monthly average
 A     2008-02  monthly average
 A     2008-03  monthly average
 A     2008-04  monthly average
 A     2008-05  monthly average
 A     2008-06  monthly average
 A     2008-07  monthly average
 A     2008-08  monthly average
 A     2008-09  monthly average
 A     2008-10  monthly average
 A     2008-11  monthly average
 A     2008-12  monthly average
 A     2009-01  monthly average

 B     2008-01  monthly average
 B     2008-02  monthly average
 B     2008-03  monthly average
 B     2008-04  monthly average
 B     2008-05  monthly average
 B     2008-06   ....

所以我的输出数据应该显示一年中每个月的每个名字。如果该月只有 NA 值,则值为 NA,或者它们是该特定月份的月平均值。

例如:

   Name    Date       C1
   A     2008-01-03   100
   A     2008-01-05   NA
   A     2008-01-07   120

在这里,我们期望:

   Name    Date       C1
   A     2008-01   (100+120)/2 = 110

例如:

   Name    Date       C1
   A     2008-01-03   NA
   A     2008-01-05   NA
   A     2008-01-07   NA

在这里,我们期望:

    Name    Date       C1
    A     2008-01   NA

例如:

   Name    Date       C1
   A     2008-01-03   100
   A     2008-01-05   50
   A     2008-01-07   120

在这里,我们期望:

    Name    Date       C1
    A     2008-01    (100+50+120)/3 = 90

由于我对 r 比较陌生而且我不知道如何解决这个问题,我希望找到能够解决这个问题的人并向我展示如何解决这样的问题。我将非常感谢您的支持:)

标签: dataframe

解决方案


library(dplyr)

#generating sample data 

data <- data.frame(Name = c(rep("A",25), rep("B",50)),
                   Date = seq(as.Date("2018-01-01"), as.Date("2020-01-12"), by = 10),
                   C1 = rep(c(100,NA,NA,NA,NA,500,320,102,412,NA,200,NA,145,800,230),5))

#grouping by Name and Month and summarizing mean of values  

data %>% 
group_by(Name, month = cut(Date, "month")) %>% 
summarise(C1 = mean(C1, na.rm = TRUE)) %>% mutate(C1 = ifelse(is.nan(C1),NA,C1))

推荐阅读