编写一个函数来计算数据集中每五个观测值的平均值和范围?如果最后一组数字中的值的数量小于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个值的消息。
嗨,这是我的问题,我知道如何编写一个函数来计算平均值和范围,但我不知道如何给出每五个观察值?
如何做到这些?
感谢。
答案 0 :(得分:1)
使用 base R
的解决方案数据
dat <- c(3,4,5,6,7,2,3,4,5,6,6,1)
为每5次观察创建指标。查看?rep
以查看参数each
和length
做什么
(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