R中的汇总统计

时间:2017-02-20 20:51:02

标签: r csv statistics summary

如何同时为不同物种(第1列)中的多个类别(第1行的不同测量)生成一些汇总统计信息(平均值,sd,范围,样本大小),并使用“write.csv()打印它们一个数据文件。如果我一次只做一个物种,我可以这么做,但我想将所有物种的所有数据放在一个.csv文件中同时生成总和统计数据。“

2 个答案:

答案 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。