计算统计数据 and/or R 中数据帧子集中多列的函数
calculate statistics and/or a function on multiple columns in subsets of a dataframe in R
我有一个数据框(以下形式的样本):
DateTime Ind1 Ind2 V1 V2 Ac1 Ac2 w1 w2 w3 shift
2016-05-01 00:01:00 U A 5 7 20 100 50 70 200 1
2016-05-01 00:01:20 U A 5 7 20 109 35 77 140 1
2016-05-01 00:01:40 U A 5 7 40 120 55 97 160 1
...
2016-05-01 00:08:20 U A 5 7 15 157 70 70 204 2
...
2016-05-02 00:08:20 U A 5 7 28 147 65 90 240 2
...
2016-05-02 00:20:00 U A 5 7 35 210 45 100 167 3
我需要一个新的数据框,其中为每个日期和班次组合列出了列 v1 到 w3 的一些统计信息(例如平均值、标准差),类似于以下内容:
Date shift Ind1 Ind2 avgV1 sdV1 avgV2 sdV2 avgAC1 ....
2016-05-01 1 U A 5.3 2.9 7.8 4.5 108 .....
2016-05-01 2 U A 6.7 3.5 8.9 5.0 99 .....
已尝试的解决方案:
我可以执行以下步骤。
1) 从 DateTime 中提取日期
df$Date <- format(as.POSIXct(df$DateTime, format="%Y-%m-%d %H:%M:%S"), format="%Y-%m-%d")
2) 按日期和班次标记数据。
df$DateShift <- paste(df$Date, df$shift)
3) 对于每个子集,计算一个列的一些统计数据:
tmp_df <- data.frame(levels(as.factor(df$DateShift)))
avgV1 <- tapply(df$V1, df$DateShift, FUN=mean)
sdV1 <- tapply(df$V1, df$DateShift, FUN=sd)
avgV2<- tapply(df$V2, df$DateShift, FUN=mean)
....
但是,我在原始数据框中有 50 多个列,具有不同类型的名称(不像上面的示例那么简单)。
此外,我想要计算的统计数据可能会有所不同(例如,计算最大值和最小值,或其他一些用户定义的函数)。
所以我不想为不同的列组合和统计类型(均值、标准偏差等)手动编码
自动化的方法是什么?
我相信 dplyr
解决方案即将到来,但是 doBy
包对这种事情非常有效,除非你有很多(数百万+)行,在这种情况下它将是慢。
library(doBy)
df_avg <- summaryBy(. ~ Date + Shift, FUN=c(mean, median, sd), data=df, na.rm=TRUE)
将给出一个带有 V1.mean
、V1.median
等的数据框。
. ~
表示 "summarize all numeric variables"。例如,如果您想保留数据框中某些因素的信息,请使用参数 id.vars = ~somefac+somefac2
。
library(dplyr)
df %>%
mutate(Date = as.Date(DateTime)) %>%
group_by(Date, shift) %>%
summarise_each(funs(mean))
我有一个数据框(以下形式的样本):
DateTime Ind1 Ind2 V1 V2 Ac1 Ac2 w1 w2 w3 shift
2016-05-01 00:01:00 U A 5 7 20 100 50 70 200 1
2016-05-01 00:01:20 U A 5 7 20 109 35 77 140 1
2016-05-01 00:01:40 U A 5 7 40 120 55 97 160 1
...
2016-05-01 00:08:20 U A 5 7 15 157 70 70 204 2
...
2016-05-02 00:08:20 U A 5 7 28 147 65 90 240 2
...
2016-05-02 00:20:00 U A 5 7 35 210 45 100 167 3
我需要一个新的数据框,其中为每个日期和班次组合列出了列 v1 到 w3 的一些统计信息(例如平均值、标准差),类似于以下内容:
Date shift Ind1 Ind2 avgV1 sdV1 avgV2 sdV2 avgAC1 ....
2016-05-01 1 U A 5.3 2.9 7.8 4.5 108 .....
2016-05-01 2 U A 6.7 3.5 8.9 5.0 99 .....
已尝试的解决方案:
我可以执行以下步骤。
1) 从 DateTime 中提取日期
df$Date <- format(as.POSIXct(df$DateTime, format="%Y-%m-%d %H:%M:%S"), format="%Y-%m-%d")
2) 按日期和班次标记数据。
df$DateShift <- paste(df$Date, df$shift)
3) 对于每个子集,计算一个列的一些统计数据:
tmp_df <- data.frame(levels(as.factor(df$DateShift)))
avgV1 <- tapply(df$V1, df$DateShift, FUN=mean)
sdV1 <- tapply(df$V1, df$DateShift, FUN=sd)
avgV2<- tapply(df$V2, df$DateShift, FUN=mean)
....
但是,我在原始数据框中有 50 多个列,具有不同类型的名称(不像上面的示例那么简单)。
此外,我想要计算的统计数据可能会有所不同(例如,计算最大值和最小值,或其他一些用户定义的函数)。
所以我不想为不同的列组合和统计类型(均值、标准偏差等)手动编码
自动化的方法是什么?
我相信 dplyr
解决方案即将到来,但是 doBy
包对这种事情非常有效,除非你有很多(数百万+)行,在这种情况下它将是慢。
library(doBy)
df_avg <- summaryBy(. ~ Date + Shift, FUN=c(mean, median, sd), data=df, na.rm=TRUE)
将给出一个带有 V1.mean
、V1.median
等的数据框。
. ~
表示 "summarize all numeric variables"。例如,如果您想保留数据框中某些因素的信息,请使用参数 id.vars = ~somefac+somefac2
。
library(dplyr)
df %>%
mutate(Date = as.Date(DateTime)) %>%
group_by(Date, shift) %>%
summarise_each(funs(mean))