使用ddply()

时间:2017-03-16 13:38:22

标签: r plyr

我不是一个R新手,但是我试图自学如何使用plyr,因为在很多情况下它比编写无尽的循环要快得多!但是,我遇到了一个问题,我似乎无法在这里,plyr的文档或其他任何地方找到答案 - 至少,我并不能识别他们就是这样。我不会排除他们在那里,我只是不认识他们!

我有一个包含许多列的数据集,我正在寻找一种在所有列上执行多个函数的方法,而无需复制代码并只更改单个参数。我已成功找到并使用numcolwise(sd)来获取每个数字列的标准偏差,这是我的第一个大障碍。我不打算输入数据集中每列的名称!使用' iris'的示例代码数据集,因为我的数据集令人讨厌:

n<-ddply(iris,"Species",numcolwise(sd)) #Calculate the sd for all numeric columns in the dataset

我得到了这个:

     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa    0.3524897   0.3790644    0.1736640   0.1053856
2 versicolor    0.5161711   0.3137983    0.4699110   0.1977527
3  virginica    0.6358796   0.3224966    0.5518947   0.2746501

这完全有效,做我想做的事。我甚至可以使列名称表明它们是标准差:

colnames(n)[2:5]<-paste(colnames(s)[2:5],".sd",sep="") #append .sd to all column names

这一切都很棒,我在昨天之前绝对不会这样做。

好的,所以我的问题就在这里。我试图尽可能高效,我宁愿不只是复制并重新运行ddply函数和colnames函数多次以结束sd的数据帧,mean的另一个数据帧,se的另一个数据帧。另外,假设我可以找到一种方法来提供多个函数作为numcolwise()的参数,我不知道我会对列名做些什么。

我知道有一些方法可以使用summarize()计算mean,sd和其他任何东西,当你这样做时,你可以指定列的名称(参见Set column name ddply)。但是我无法弄清楚如何或者是否在那里使用的方法总结可以与numcolwise()和多个函数参数(sd,mean,...)一起使用来得到这样的东西:

     Species Sepal.Length.sd Sepal.Width.sd Petal.Length.sd Petal.Width.sd Sepal.Length.mean Sepal.Width.mean Petal.Length.mean Petal.Width.mean
1     setosa       0.3524897      0.3790644       0.1736640      0.1053856             5.006            3.428             1.462            0.246
2 versicolor       0.5161711      0.3137983       0.4699110      0.1977527             5.936            2.770             4.260            1.326
3  virginica       0.6358796      0.3224966       0.5518947      0.2746501             6.588            2.974             5.552            2.026

注意:我知道我可以使用某种“蛮力”来做到这一点。使用join()的方法,因为我已经完成了与我需要一起刷的其他数据集。但这似乎有些不雅和重复,我最终会有一个甚至更大的数据集来实现这一点,因为现在我只是处理我的试验数据。 / p>

1 个答案:

答案 0 :(得分:2)

使用dplyr非常简单:

require(dplyr)
iris %>% group_by(Species) %>% summarise_all(funs(mean,sd))