在我的研究中,每个人都在一个数据集中。它是一个时间序列数据,因此每一行都是相等的时间量。在我的研究中,我分为三个不同的小组。因此,我想对属于一组的所有数据集求平均。最后,我想要一个数据集,每一行是一小时,并且单元格中的值是该时间点该组的平均值。现在的问题是我的数据集缺少很多值。我有两种方法来求平均值并按小时汇总。
这是一个个体的数据集的样子(数据集的行多于以下指示):
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.2
和daxy.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,则结果完全相同。
我的问题是这两种方法中哪一种是正确的。首先平均一组中每个单独的数据集,然后每小时进行汇总。还是先每小时汇总每个单独的数据集,然后平均每个组的数据集?
答案 0 :(得分:0)
我还没有完全理解问题,所以这是我所做的。请随意不将其视为答案。
首先,如果要按小时和V2
,V3
和V4
的组进行平均,则应该像完成操作一样对所有数据框进行绑定。然后,尝试以下方法:
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*
组进行平均。这根本不是一回事。使用上面的代码,结果将是正确的,就是您想要的。