使用by()表示min& R

时间:2016-03-23 21:16:55

标签: r function

我可以在此行中添加内容以包含分钟和最大值吗?

我的数据包含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的大小:

  • 有没有办法可以包含最小值和最大值?
  • 或者是否有类似的建议?

将值放在表中进行进一步操作会很棒。

2 个答案:

答案 0 :(得分:2)

我认为“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。

您还可以在函数(x)参数中添加更多摘要统计信息。

答案 1 :(得分:1)

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

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