R ddply+;汇总以在大量列中重复相同的统计函数

R ddply+;汇总以在大量列中重复相同的统计函数,r,multiple-columns,plyr,idioms,split-apply-combine,R,Multiple Columns,Plyr,Idioms,Split Apply Combine,好的,接着是第二个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.

好的,接着是第二个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
summary
的组合来计算集合(例如,全年每小时的平均值)

在上面的例子中,我将创建一个类别,例如hour(例如,
strtime(data$Timestamp,“%H”)->data$hour
,然后在
ddply
中使用该类别,如
ddply(data,“hour”,summary,St_01=平均值(St_01),St_02=平均值(St_02)
,在每列中按类别平均

但这就是问题的症结所在。我有40多列要处理,我不准备逐一键入它们作为
summary
函数的参数。我曾经在shell中编写一个循环来生成此代码,但程序员不是这样解决问题的,是吗


那么请告诉我,有没有人有更好的方法来实现相同的结果,但只需较少的按键?

您可以使用
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


编辑

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

图书馆(E2)


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

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
另一个选择是哈德利的
dplyr
包的新版本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

或者长时间重塑
St
变量,然后使用您最喜欢的聚合函数
by
aggregate
ddply
组合
c(小时,索引)
,其中
index
是在重塑过程中创建的变量。对您来说很容易:-)谢谢!哈哈哈。对人性的信仰恢复了。一件事。它是如何与Summary一起工作的?因为我也需要在每一列中进行分类总结。我不知道你的意思。使用
colwise
或family通常意味着不需要使用
summary
。你能详细谈谈你的问题吗?@R-L这是两种不同的方法。两者都有各自的优点。如果你想对每一列进行大量的统计计算,并且想看看中间的结果,那么
melt
one就很好了。
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
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