【问题标题】:Using by() for min & max for multiple factors in R将 by() 用于 R 中的多个因子的最小值和最大值
【发布时间】:2016-03-23 21:16:54
【问题描述】:

我可以在这一行中添加一些内容以包括 mins 和 max 吗?

我的数据包含 4000 天的数据,我想要一种简单的方法来获取这些天的最小值、平均值和最大值。 最好在同一个输出中

> head(dd)
    Time  RPH    T  Days
1  00:00:00  6.42 39.6 Day 1
2  00:15:00  6.46 39.7 Day 1
3  00:30:00  6.30 39.6 Day 1
4  00:45:00  6.26 39.4 Day 1
5  01:00:00  6.23 39.3 Day 1
6  01:15:00  6.23 38.5 Day 1

每天有 96 次观察。它与 Iris data.frame 的格式非常相似。我用这个作为我的例子。

iris
by(iris[,1:4],iris$Species,colMeans)

输出:

>by(iris[,1:4],iris$Species,colMeans)
 iris$Species: setosa
 Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
   5.006        3.428        1.462        0.246 
------------------------------------------------------------ 
iris$Species: versicolor
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
   5.936        2.770        4.260        1.326 
------------------------------------------------------------ 
iris$Species: virginica
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
   6.588        2.974        5.552        2.026 

这很棒,但考虑到我正在使用的 data.frame 的大小:

  • 有没有办法可以在其中包含最小值和最大值?
  • 或者有类似的建议吗?

将值放在表格中以供进一步操作会很棒。

【问题讨论】:

    标签: r function


    【解决方案1】:

    我认为“doBy”包在这里可能有用。它按组汇总数据并返回一个 data.frame 对象,该对象将允许您进行任何进一步的操作。试试这个:

    install.packages("doBy")
    library(doBy)
    
    df <- summaryBy(Sepal.Length + Sepal.Width + Petal.Length + Petal.Width ~ Species,data=iris,
                    FUN=function(x){c(min=min(x),max=max(x), mean=mean(x))})
    

    “~”之前的变量是您要汇总的变量,而“~”之后的变量是您要分组的变量。所以上面所做的就是总结:1. Sepal.Length, 2. Sepal.Width, 3.Petal.Length 和 4.Petal.Width by Species。

    您也可以在 function(x) 参数中添加更多汇总统计信息。

    【讨论】:

    • 非常感谢,非常简单并生成了一个数据框,非常棒,谢谢:)
    【解决方案2】:

    如果你想要一个快捷方式,我们可以使用 psych 包中的 describeBy()

    library(psych)
    describeBy(iris[,1:4], iris$Species)
    #group: setosa
    #             vars  n mean   sd median trimmed  mad min max range skew kurtosis   se
    #Sepal.Length    1 50 5.01 0.35    5.0    5.00 0.30 4.3 5.8   1.5 0.11    -0.45 0.05
    #Sepal.Width     2 50 3.43 0.38    3.4    3.42 0.37 2.3 4.4   2.1 0.04     0.60 0.05
    #Petal.Length    3 50 1.46 0.17    1.5    1.46 0.15 1.0 1.9   0.9 0.10     0.65 0.02
    #Petal.Width     4 50 0.25 0.11    0.2    0.24 0.00 0.1 0.6   0.5 1.18     1.26 0.01
    

    一种可能的base R 解决方案具有稍微不同的输出结构,可以使用summary()tapply() - 组合Species - 和lapply,循环列。

    lapply(iris, function(x) tapply(x, iris$Species, summary))
    #$Sepal.Length
    #$Sepal.Length$setosa
    #   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    #  4.300   4.800   5.000   5.006   5.200   5.800 
    #
    #$Sepal.Length$versicolor
    #   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    #  4.900   5.600   5.900   5.936   6.300   7.000 
    #
    #$Sepal.Length$virginica
    #   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    #  4.900   6.225   6.500   6.588   6.900   7.900 
    

    【讨论】:

    • 嘿,我也喜欢这个,还有这么多的信息,我一定会觉得这非常有用!!非常感谢!:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 2013-06-05
    • 2020-06-24
    • 1970-01-01
    相关资源
    最近更新 更多