如何同时为不同物种(第1列)中的多个类别(第1行的不同测量)生成一些汇总统计信息(平均值,sd,范围,样本大小),并使用“write.csv()打印它们一个数据文件。如果我一次只做一个物种,我可以这么做,但我想将所有物种的所有数据放在一个.csv文件中同时生成总和统计数据。“
答案 0 :(得分:1)
我知道你在说什么。假设您想获得平均值,标准偏差,范围和样本量。因为R给出的函数范围并没有给出数字集中数字最小的逗号最大数字,所以它给了我一个问题。神奇的是tapply()。我只是使用transpose t()和as.matrix来更容易放入数据框。
无论如何,请看一下内置的虹膜数据集。
data(iris)
我将仅针对Sepal Length给出所有这些的均值,sd和样本大小,使用rbind将所有值写入数据帧的行,然后最后使用rownames()给出行名称。
这样做:
mean_sepal_length = t(as.matrix(tapply(iris$Sepal.Length, iris$Species, mean)))
mean_sepal_length
sd_sepal_length = t(as.matrix(tapply(iris$Sepal.Length, iris$Species, FUN = sd)))
sd_sepal_length
sample_size_sepal_length = t(as.matrix(tapply(iris$Sepal.Length, iris$Species, FUN = length)))
sample_size_sepal_length
df_sepal_length <- data.frame(mean_sepal_length)
df_sepal_length
View(df_sepal_length)
df_sepal_length = rbind(df_sepal_length, sd_sepal_length)
df_sepal_length = rbind(df_sepal_length, sample_size_sepal_length)
rownames(df_sepal_length) <- c("Mean_sepal_length", "sd_sepal_length", "size_sepal_length")
write.csv(df_sepal_length, "C:/Users/me/Documents/tapply_miracle.csv")
答案 1 :(得分:0)
我在考虑我当天给出的回答,当我意识到tapply函数可以接受INDEX变量作为列表时,我认为可能会更好。在我的例子中,我只知道tapply可以对一个因素进行分类,但我们可以指定多个因素。诀窍是将虹膜数据帧从宽扩展为长形式,使用函数melt()使其更具可读性,然后使用list参数进行tapply:
> 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。