Reu*_* L. 23 r idiomatic multiple-columns plyr 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.975 25.695 ...
...
Run Code Online (Sandbox Code Playgroud)
基本上我通常会使用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中编写一个循环来生成这个代码,但这不是程序员如何解决问题的呢?
所以祈祷告诉,有没有人有更好的方法来实现相同的结果,但更少的击键?
And*_*rie 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
Run Code Online (Sandbox Code Playgroud)
同样,catcolwise()总结所有分类列.
有关?numcolwise更多帮助和示例,请参阅.
编辑
另一种方法是使用reshape2(由@ gsk3提出).在这个例子中,这有更多的击键,但给你巨大的灵活性:
库(reshape2)
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
Run Code Online (Sandbox Code Playgroud)
您甚至可以通过完全省略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
Run Code Online (Sandbox Code Playgroud)
使用data.table包也可以非常快速地计算相同的结果.的.SD第j表达变量是包含用于每个组的数据,但不包括使用的所有列的子集中的特殊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
Run Code Online (Sandbox Code Playgroud)
另一种选择是0.2哈德利的新版本的dplyr包
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
Run Code Online (Sandbox Code Playgroud)