23

好的,接下来是第二个 R 问题。

我的数据:

           Timestamp    St_01  St_02 ...
1 2008-02-08 00:00:00  26.020 25.840 ...
2 2008-02-08 00:10:00  25.985 25.790 ...
3 2008-02-08 00:20:00  25.930 25.765 ...
4 2008-02-08 00:30:00  25.925 25.730 ...
5 2008-02-08 00:40:00  25.975 25.695 ...
...

基本上通常我会使用ddply和的组合summarize来计算合奏(例如全年每小时的平均值)。

在上述情况下,我将创建一个类别,例如小时(例如strptime(data$Timestamp,"%H") -> data$hour,然后在 中使用该类别ddply,例如ddply(data,"hour", summarize, St_01=mean(St_01), St_02=mean(St_02)...)按每个列的类别进行平均。

但这是它变得粘稠的地方。我有 40 多列要处理,我不准备将它们一一键入作为summarize函数的参数。我曾经在 shell 中编写一个循环来生成这段代码,但这不是程序员解决问题的方式吗?

所以祈祷告诉,有没有人有更好的方法来实现相同的结果,但击键次数更少?

4

2 回答 2

38

您可以使用numcolwise()对所有数字列运行摘要。

这是一个使用示例iris

ddply(iris, .(Species), numcolwise(mean))
     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa        5.006       3.428        1.462       0.246
2 versicolor        5.936       2.770        4.260       1.326
3  virginica        6.588       2.974        5.552       2.026

同样,catcolwise()要对所有分类列进行汇总。

有关?numcolwise更多帮助和示例,请参阅。


编辑

另一种方法是使用reshape2(由@gsk3 提出)。在此示例中,这有更多的击键,但为您提供了极大的灵活性:

图书馆(重塑2)

miris <- melt(iris, id.vars="Species")
x <- ddply(miris, .(Species, variable), summarize, mean=mean(value))

dcast(x, Species~variable, value.var="mean")
     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa        5.006       3.428        1.462       0.246
2 versicolor        5.936       2.770        4.260       1.326
3  virginica        6.588       2.974        5.552       2.026
于 2012-05-28T16:28:52.353 回答
7

您甚至可以通过完全省略 ddply 调用来简化 Andrie 提出的第二种方法。只需mean在 dcast 调用中指定为聚合函数:

library(reshape2)
miris <- melt(iris, id.vars="Species")
dcast(miris, Species ~ variable, mean)

     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa        5.006       3.428        1.462       0.246
2 versicolor        5.936       2.770        4.260       1.326
3  virginica        6.588       2.974        5.552       2.026

使用该data.table包也可以非常快速地计算出相同的结果。j 表达式中的.SD变量是一个特殊的 data.table 变量,其中包含每个组的数据子集,不包括 中使用的所有列by

library(data.table)
dt_iris <- as.data.table(iris)
dt_iris[, lapply(.SD, mean), by = Species]

     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1:     setosa        5.006       3.428        1.462       0.246
2: versicolor        5.936       2.770        4.260       1.326
3:  virginica        6.588       2.974        5.552       2.026

另一个选择是 Hadleydplyr软件包的新版本 0.2

library(dplyr)
group_by(iris, Species) %>% summarise_each(funs(mean))

Source: local data frame [3 x 5]

     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa        5.006       3.428        1.462       0.246
2 versicolor        5.936       2.770        4.260       1.326
3  virginica        6.588       2.974        5.552       2.026
于 2014-04-25T14:14:40.830 回答