【问题标题】:calculate statistics and/or a function on multiple columns in subsets of a dataframe in R计算 R 中数据帧子集中多列的统计信息和/或函数
【发布时间】:2017-12-24 13:43:03
【问题描述】:

我有一个数据框(以下形式的样本):

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) 对于每个子集,计算一个 col 的一些统计数据:

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 多列,具有不同类型的名称(不像上面的示例那么简单)。
此外,我想要计算的统计数据可能会有所不同(例如,计算最大值和最小值,或其他一些用户定义的函数)。

所以我不想为不同的列组合和统计类型(平均值、标准开发等)手动编写代码
自动化的方法是什么?

【问题讨论】:

    标签: r dataframe subset multiple-columns tapply


    【解决方案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

    【讨论】:

    • 感谢 Remko 的回复。如何省略不应计算统计信息的列(上面的 Ind1 和 Ind2)?
    • 我认为您可以使用 id.vars 参数,然后将它们删除,或者保持原样并在完成后将它们扔掉,例如dfr &lt;- dfr[,!grepl("Ind1|Ind2", names(dfr))](必须这样做才能删除 Ind1.meanInd1.median 等)
    【解决方案2】:
    library(dplyr)
    
    df %>%
      mutate(Date = as.Date(DateTime)) %>%
      group_by(Date, shift) %>%
      summarise_each(funs(mean))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      相关资源
      最近更新 更多