ddply +总结了跨大量列的重复相同的统计功能(ddply + summarize for rep

2019-06-24 21:24发布

临门好了,第二个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 ...
...

基本上通常我会用的组合ddplysummarize计算歌舞团(例如,意味着在整个一年每小时)。

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

但这里是它得到粘。 我有超过40列应对,我不准备把它全逐一作为参数传递给summarize的功能。 我以前写的壳循环生成的代码,但是这不是程序员是如何解决的问题是什么呢?

所以请告诉,没有任何人有实现相同的结果,但用更少的按键更好的办法?

Answer 1:

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


Answer 2:

你甚至可以完全省略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