我正在考虑我当天给出的答案,当我意识到 tapply 函数可以接受 INDEX 变量作为列表时,我认为它可能会更好。在我的示例中,我只知道 tapply 可以对一个因素进行分类,但我们可以指定多个因素。诀窍是使用函数 melt() 将 iris 数据帧从宽格式融合为长格式,使其更具可读性,然后使用列表参数点击:
> install.packages("reshape2")
> library(reshape2)
# I used melt to restyle the iris dataframe from wide to long turning the many columns into rows with less columns, and I coerced the iris dataset back to a dataframe.
> iris_melt <- data.frame(melt(data = iris, id = "Species", variable.name = "iris_factors", value.name = "iris_dimensions_cm"))
> head(iris_melt)
Species iris_factors iris_dimensions_cm
1 setosa Sepal.Length 5.1
2 setosa Sepal.Length 4.9
3 setosa Sepal.Length 4.7
4 setosa Sepal.Length 4.6
5 setosa Sepal.Length 5.0
6 setosa Sepal.Length 5.4
在这里,我们将获得所有虹膜因素的平均花朵尺寸:萼片长度、萼片宽度、花瓣长度和所有物种(setosa、virginica、versicolor)的花瓣宽度。
> tapply(X = iris_melt$iris_dimensions_cm, INDEX = list(iris_melt$Species, iris_melt$iris_factors), FUN = mean)
Sepal.Length Sepal.Width Petal.Length Petal.Width
setosa 5.006 3.428 1.462 0.246
versicolor 5.936 2.770 4.260 1.326
virginica 6.588 2.974 5.552 2.026
如果我们改变 INDEXed 列表中因子的顺序,我们可以通过翻转行和列来获得以稍微不同的格式呈现给我们的相同信息:
> tapply(X = iris_melt$iris_dimensions_cm, INDEX = list(iris_melt$iris_factors, iris_melt$Species), FUN = mean)
setosa versicolor virginica
Sepal.Length 5.006 5.936 6.588
Sepal.Width 3.428 2.770 2.974
Petal.Length 1.462 4.260 5.552
Petal.Width 0.246 1.326 2.026
获得标准差很容易。只需更改 FUN 参数:
> tapply(X = iris_melt$iris_dimensions_cm, INDEX = list(iris_melt$iris_factors, iris_melt$Species), FUN = sd)
setosa versicolor virginica
Sepal.Length 0.3524897 0.5161711 0.6358796
Sepal.Width 0.3790644 0.3137983 0.3224966
Petal.Length 0.1736640 0.4699110 0.5518947
Petal.Width 0.1053856 0.1977527 0.2746501
现在我基本上不用 Rbind 了。