【问题标题】:Data aggregation loop in RR中的数据聚合循环
【发布时间】:2011-09-19 14:20:18
【问题描述】:

我在将数据聚合到日常数据时遇到了问题。 我有一个数据框,其中 NA 已被删除(数据图片链接如下)。数据每天收集 3 次,但有时由于 NA,每天只有 1 或 2 个条目;有些日子数据完全丢失。

我现在有兴趣计算“dist”的每日平均值:这意味着将一天的“dist”数据相加并除以每天的条目数(如果当天没有数据丢失)。我想通过循环来做到这一点。 我怎样才能用循环做到这一点?问题是有时我每天有 3 个条目,有时只有 2 个甚至 1 个。我想告诉 R,每天,它应该总结“dist”除以每天可用的条目数

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

一月

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

编辑:我按照建议使用了聚合和点击,但是,数据的平均值并没有真正计算出来:

              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)

【问题讨论】:

  • 查看包“zoo”,它可以处理缺少数据的时间序列。

标签: r dataframe aggregate


【解决方案1】:

不要使用循环。使用 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']
    

    【讨论】:

    • 有趣,虽然聚合适用于我的较小子集,但原始数据集相当大,所以我会检查一下。谢谢
    【解决方案3】:

    看起来您的主要问题是您的 date 字段附加了时间。您需要做的第一件事是使用类似的东西创建一个只有日期的列

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

    然后使用 Joris 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))
    }
    

    但请记住,这会很慢并且内存效率低。

    【讨论】:

    • 感谢您的努力,连同 Joris Meys 的回答,聚合奏效了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 2014-09-19
    • 2016-08-07
    • 2019-03-23
    相关资源
    最近更新 更多