使用 ddply() 在数据框中的所有数字列上执行多个函数(均值、sd 等)
Performing multiple functions (mean, sd, etc.) on all numeric columns in a dataframe with ddply()
我不是 R 新手,但我正在尝试自学如何使用 plyr,因为在很多情况下它比编写无休止的 for 循环要快得多!但是,我 运行 遇到了一个问题,我似乎无法在这里、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() 来计算平均值、sd 和其他任何东西,并且当您这样做时,您可以指定列的名称(请参阅 Set column name ddply)。但我无法弄清楚在那里使用的方法与 summarize 如何或是否可以与 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" 方法来做到这一点,因为我已经用我需要混合在一起的其他数据集完成了这一点。但这似乎有些不雅和重复,我最终将有一个甚至 更大的 数据集来执行此操作,因为现在我只是在处理我的试点数据。
使用 dplyr
非常简单:
require(dplyr)
iris %>% group_by(Species) %>% summarise_all(funs(mean,sd))
我不是 R 新手,但我正在尝试自学如何使用 plyr,因为在很多情况下它比编写无休止的 for 循环要快得多!但是,我 运行 遇到了一个问题,我似乎无法在这里、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() 来计算平均值、sd 和其他任何东西,并且当您这样做时,您可以指定列的名称(请参阅 Set column name ddply)。但我无法弄清楚在那里使用的方法与 summarize 如何或是否可以与 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" 方法来做到这一点,因为我已经用我需要混合在一起的其他数据集完成了这一点。但这似乎有些不雅和重复,我最终将有一个甚至 更大的 数据集来执行此操作,因为现在我只是在处理我的试点数据。
使用 dplyr
非常简单:
require(dplyr)
iris %>% group_by(Species) %>% summarise_all(funs(mean,sd))