2017-07-19 82 views
1

我有一个数据帧(以下形式的样品):计算统计数据和/或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)从日期时间

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分多列在原来的数据帧,与不同类型的名称(而不是简单在上面的例子中)。
此外,我想要计算的统计数据可能会有所不同(比如,计算最大值和最小值,或其他用户定义的函数)。

所以我不想手工编写列的不同组合和统计类型(平均值,标准dev等)
这是什么方法来实现这个自动化?

回答

1

我确定dplyr解决方案即将推出,但doBy包对于这类事情非常适用,除非您有很多(百万+)行,在这种情况下它会很慢。

library(doBy) 
df_avg <- summaryBy(. ~ Date + Shift, FUN=c(mean, median, sd), data=df, na.rm=TRUE) 

会给出一个数据帧与V1.meanV1.median,等等。 . ~表示“汇总所有数字变量”。例如,如果要在数据框中保留某些因素的信息,请使用参数id.vars = ~somefac+somefac2

+0

感谢您的回复Remko。如何忽略不应计算统计数据的列(上面的Ind1和Ind2)? – Sree

+0

我认为你可以使用'id.vars'参数,然后删除它们,或者保持原样并在完成时抛弃它们。 ''dfr < - dfr [,!grepl(“Ind1 | Ind2”,names(dfr))]''(必须这样去除'Ind1.mean','Ind1.median'等) –

0
library(dplyr) 

df %>% 
    mutate(Date = as.Date(DateTime)) %>% 
    group_by(Date, shift) %>% 
    summarise_each(funs(mean)) 
相关问题