我不是一个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>
答案 0 :(得分:2)
使用dplyr
非常简单:
require(dplyr)
iris %>% group_by(Species) %>% summarise_all(funs(mean,sd))