2012-05-28 31 views
21

好的,第二个R问题快速连续。ddply +总结重复相同的统计功能,跨越大量的列

我的数据:

  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函数的参数我曾经在shell中编写一个循环来生成这段代码,但这不是程序员如何解决问题的方式吗?

所以祈祷告诉,没有人有更好的获得相同结果但键击较少的方法?

+0

使用'numcolwise()' – Andrie

+2

或者重塑'St'变量长,然后用你最喜欢的聚集功能'by','aggregate','ddply'由'C结合(小时,index)',其中'index'是重塑中创建的变量。 –

+0

易点雅:-) – 2015-04-24 02:34:02

回答

36

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

下面是使用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了解更多帮助和示例。


EDIT

一种替代方法是使用reshape2(由@ GSK3提议)。这在这个例子中更多的按键,但给你极大的灵活性:通过完全省略ddply呼叫

库(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 
+0

看起来不错!谢谢! –

+0

有一点。它如何与总结一起工作?因为我需要在每一列中分类总结。 –

+1

我不确定你的意思。使用'colwise'或家庭通常意味着你不需要使用'summarize'。你能否扩展你的问题? – Andrie

7

你甚至可以通过简化提出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 

还有一种选择是新版本0。哈德利的dplyr包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