平均聚合数据集时如何处理NA

时间:2019-01-02 14:34:22

标签: r aggregate

在我的研究中,每个人都在一个数据集中。它是一个时间序列数据,因此每一行都是相等的时间量。在我的研究中,我分为三个不同的小组。因此,我想对属于一组的所有数据集求平均。最后,我想要一个数据集,每一行是一小时,并且单元格中的值是该时间点该组的平均值。现在的问题是我的数据集缺少很多值。我有两种方法来求平均值并按小时汇总。

这是一个个体的数据集的样子(数据集的行多于以下指示):

              DateTime       V2
1: 2018-01-01 20:38:00 2.346598
2: 2018-01-01 20:42:00       NA
3: 2018-01-01 20:46:00       NA
4: 2018-01-01 20:50:00 6.000000
5: 2018-01-01 20:54:00 5.234660
6: 2018-01-01 20:58:00 6.132660

我习惯于这样做。

方法一:

我首先对两个数据集之间的每一行取平均,然后按小时汇总平均后的数据集。

daxy<-bind_rows(dx,dy) %>%
  group_by(DateTime) %>%
  summarise_all(funs(mean(., na.rm = TRUE))) #average the two datasets

daxy.1 <- melt(as.data.frame(daxy), id=c("DateTime")) #melt the data in right format
daxy.2 <- aggregate(daxy.1$value,  by=list(format(daxy.1$DateTime, "%Y-%m-%d %H"),variable=daxy.1$variable), 
                    FUN=mean,na.rm = TRUE) #Aggregate all values by hour and calculate the mean for every hour

方法二:

对于每个单独的数据集,我汇总数据集冷杉(计算每小时的平均值),然后对这些汇总的数据集求平均值。

dx.1 <- melt(as.data.frame(dx), id=c("DateTime"))
dx.2 <- aggregate(dx.1$value,  by=list(format(dx.1$DateTime, "%Y-%m-%d %H"),variable=dx.1$variable), 
                  FUN=mean,na.rm = TRUE) #Aggregate individual X by hour
dy.1 <- melt(as.data.frame(dy), id=c("DateTime"))
dy.2 <- aggregate(dy.1$value,  by=list(format(dy.1$DateTime, "%Y-%m-%d %H"),variable=dy.1$variable), 
                  FUN=mean,na.rm = TRUE) #Aggregate individual Y by hour

daxy.3 <-bind_rows(dx.2,dy.2) %>%
  group_by(variable,Group.1) %>%
  summarise_all(funs(mean(., na.rm = TRUE))) #Average aggregated individuals X ad Y 

现在,我希望daxy.2daxy.3每小时具有相同的平均值。但这是结果:

  

head(daxy.2)

        Group.1 variable        x
1 2018-01-01 20       V2 3.666548
2 2018-01-01 21       V2 5.543472
  

head(daxy.3)

   variable    Group.1         x
1    V2    2018-01-01 20    3.732948
2    V2    2018-01-01 21    6.409164

我知道这种差异是由于缺少值造成的。如果我将所有缺失值都替换为0,则结果完全相同。

我的问题是这两种方法中哪一种是正确的。首先平均一组中每个单独的数据集,然后每小时进行汇总。还是先每小时汇总每个单独的数据集,然后平均每个组的数据集?

1 个答案:

答案 0 :(得分:0)

我还没有完全理解问题,所以这是我所做的。请随意将其视为答案。
首先,如果要按小时和V2V3V4的组进行平均,则应该像完成操作一样对所有数据框进行绑定。然后,尝试以下方法:

library(tidyverse)
library(reshape2)

daverage.1 <- melt(daverage, id.vars = "DateTime")

daverage.2 <- aggregate(value ~ format(DateTime, "%Y-%m-%d H") + variable, daverage.1, 
          FUN = mean, na.rm = TRUE)

daverage.3 <- daverage.1 %>%
  mutate(DateHour = format(DateTime, "%Y-%m-%d H")) %>%
  group_by(DateHour, variable) %>%
  summarise(value = mean(value, na.rm = TRUE))

all.equal(as.data.frame(daverage.2), as.data.frame(daverage.3))
#[1] "Names: 1 string mismatch"

如您所见,两种方法均产生相等的平均值。列名称中只有一个是不同的。

对于获得的不同结果,似乎您是按小时进行平均。然后使用此结果对V*组进行平均。这根本不是一回事。使用上面的代码,结果将是正确的,就是您想要的。