2011-09-19 73 views
1

我正在面临将我的数据聚合到日常数据的问题。 我有一个数据帧,其中NA已被删除(数据的图片链接在下面给出)。数据每天收集3次,但有时由于新生,每天只有1或2个条目;有些日子数据完全丢失。R中的数据聚合循环

我现在对感兴趣,计算“dist”的日均值:这意味着总结一天中“dist”的数据并将其除以每天的条目数(如果没有数据,则为3错过那一天)。我想通过循环做到这一点。 我怎样才能做到这一点循环?问题是,有时我每天有3个条目,有时只有2或甚至1.我想告诉R,每天,它应该总结“dist”除以条目数每天都有供应。

我只是不知道如何为此制定一个for循环。如果你能就这个问题给我任何建议,我将不胜感激。感谢你的努力和亲切的问候,

数据帧:http://www.pic-upload.de/view-11435581/Data_loop.jpg.html

编辑:我使用的骨料和tapply的建议,但是,并没有真正计算数据的平均值:

使用
   Group.1   x 
1 2006-10-06 12:00:00 636.5395 
2 2006-10-06 20:00:00 859.0109 
3 2006-10-07 04:00:00 301.8548 
4 2006-10-07 12:00:00 649.3357 
5 2006-10-07 20:00:00 944.8272 
6 2006-10-08 04:00:00 136.7393 
7 2006-10-08 12:00:00 360.9560 
8 2006-10-08 20:00:00  NaN 

的代码是:

dates<-Dis_sub$date 
distance<-Dis_sub$dist 
aggregate(distance,list(dates),mean,na.rm=TRUE) 
tapply(distance,dates,mean,na.rm=TRUE) 
+1

查看可以处理缺失数据的时间序列的软件包“zoo”。 – Benjamin

回答

6

不要使用循环。使用R.一些示例数据:

dates <- rep(seq(as.Date("2001-01-05"), 
       as.Date("2001-01-20"), 
       by="day"), 
      each=3) 
values <- rep(1:16,each=3) 
values[c(4,5,6,10,14,15,30)] <- NA 

任何的:

aggregate(values,list(dates),mean,na.rm=TRUE) 

tapply(values,dates,mean,na.rm=TRUE) 

给你想要的东西。另见?aggregate?tapply

如果你想有一个数据帧后,能不能看包plyr

Data <- as.data.frame(dates,values) 
require(plyr) 

ddply(data,"dates",mean,na.rm=TRUE) 

记住ddply没有完全配套的日期格式(还)。

2

看看data.table包,尤其是如果你的数据很大。这里有一些代码可以通过day来计算dist的平均值。

library(data.table) 
dt = data.table(Data) 
Data[,list(avg_dist = mean(dist, na.rm = T)),'date'] 
+1

有趣的是,虽然聚合为我的较小子集工作,但原始数据集相当大,所以我会检查一下。谢谢 –

1

看起来您的主要问题是您的date字段有附加时间。你需要做的第一件事是创建具有使用类似

Dis_sub$date_only <- as.Date(Dis_sub$date) 

然后用里斯Meys'解决方案(这是做正确的方式)应该只是日期的一列。

但是,如果由于某种原因,你真的使用了循环,你可以尝试像

newFrame <- data.frame() 
for d in unique(Dis_sub$date){ 
    meanDist <- mean(Dis_sub$dist[Dis_sub$date==d],na.rm=TRUE) 
    newFrame <- rbind(newFrame,c(d,meanDist)) 
} 

但请记住,这将是缓慢和内存效率低下。

+0

感谢您的努力,以及Joris Meys的解答工作。 –