使用R编写一个函数来计算每五个观测值的范围

时间:2014-04-23 11:37:35

标签: r

编写一个函数来计算数据集中每五个观测值的平均值和范围?如果最后一组数字中的值的数量小于5,则需要给出关于它的注释。 例如,如果数据是3,4,5,6,7,2,3,4,5,6,6,1 该函数应返回: 平均值和范围(3,4,5,6,7) 平均值和范围(2,3,4,5,6) 和(6,1)和的平均值和范围 在最后一组中只有2个值的消息。

嗨,这是我的问题,我知道如何编写一个函数来计算平均值和范围,但我不知道如何给出每五个观察值?

如何做到这些?

感谢。

4 个答案:

答案 0 :(得分:1)

使用 base R

的解决方案

数据

dat <- c(3,4,5,6,7,2,3,4,5,6,6,1)

为每5次观察创建指标。查看?rep以查看参数eachlength做什么

(grp <- rep(1:length(dat), each=5, length=length(dat)))
#  [1] 1 1 1 1 1 2 2 2 2 2 3 3

计算统计数据:其中n表示用于计算统计数据的每个观测值的数量(n)

by(dat , list(group=grp) , function(i) c(mean=mean(i),
                                         min=min(i),
                                         max=max(i),
                                         n = length(i)))

注意:您可以用函数aggregate替换by函数来生成data.frame作为输出。

答案 1 :(得分:0)

这是一个plyr解决方案。您可以根据ct列输出警告。我认为总结和警告的行为应该分开,所以我没有把它包括在内。

> library(plyr)
> dat<-data.frame(c1=c(3,4,5,6,7,2,3,4,5,6,6,1))
> dat$grp<-with(dat, cumsum(1==rep(1:5, length=length(c1))))
> ddply(dat, .(grp), summarize, mean=mean(c1),min=min(c1), max=max(c1), ct=length(c1))
  grp mean min max ct
1   1  5.0   3   7  5
2   2  4.0   2   6  5
3   3  3.5   1   6  2

答案 2 :(得分:0)

您所描述的是滚动功能。看看这个link

答案 3 :(得分:0)

另一种解决方案,如果您是R的新手,可能会更简单:

average5=function(vector_data){
  # transform data into dataframe
  df=data.frame(a=vector_data)
  #create new column class  
  df$class=ceiling(1:(nrow(df))/5)

  # calculate mean by class
  average=aggregate(a~class,data=df,FUN='mean')

  # test if number of rows is a multiple of 5
  # keep only the second column and transform it into a vector
  if (nrow(df)%%5==0){
    average=average$a
  } else {
    #remove last class
    average=average$a[1:(nrow(average)-1)] 
    cat("Last group has only",nrow(df)%%5,"values \n")
  }
  return(average)
}

输出结果为:

> test=c(3,4,5,6,7,2,3,4,5,6,6,1)
> average5(test)
 Last group has only 2 values 
 [1] 5 4