首页 文章

使用ddply()在数据框中的所有数字列上执行多个函数(mean,sd等)

提问于
浏览
1

我不是一个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的数据帧,另一个数据帧为意思是,而另一个是se . 另外,假设我可以找到一种方法来提供多个函数作为numcolwise()的参数,我不知道我会对列名做什么 .

我知道有一些方法可以使用summarize()来计算mean,sd和其他任何东西,当你这样做时,你可以指定列的名称(参见Set column name ddply) . 但我无法弄清楚如何,或者是否,使用sumcolwise的方法可以与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()的"brute force"方法来做到这一点,因为我最终会有一个更大的数据集来执行此操作,因为现在我只是处理我的试验数据 .

1 回答

  • 2

    使用 dplyr 非常简单:

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

相关问题