临门好了,第二个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
的功能。 我以前写的壳循环生成的代码,但是这不是程序员是如何解决的问题是什么呢?
所以请告诉,没有任何人有实现相同的结果,但用更少的按键更好的办法?
您可以使用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提议)。 这在这个例子中更多的按键,但给你极大的灵活性:
库(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
你甚至可以完全省略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
包。 该.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
另一种选择是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
文章来源: ddply + summarize for repeating same statistical function across large number of columns