【问题标题】:Aggregating daily content汇总每日内容
【发布时间】:2010-09-01 17:21:22
【问题描述】:

我一直在尝试汇总(有些不稳定的)每日数据。我实际上正在使用 csv 数据,但如果我重新创建它 - 它看起来像这样:

library(zoo)

dates <- c("20100505", "20100505", "20100506", "20100507")
val1 <- c("10", "11", "1", "6")
val2 <- c("5", "31", "2", "7")

x <- data.frame(dates = dates, val1=val1, val2=val2)
z <- read.zoo(x, format = "%Y%m%d")

现在我想每天汇总一下(请注意,有时一天有 >1 个数据点,有时没有。

我已经尝试了很多很多变化,但我似乎无法汇总,所以例如这失败了:

aggregate(z, as.Date(time(z)), sum)
# Error in Summary.factor(2:3, na.rm = FALSE) : sum not meaningful for factors

似乎有很多关于聚合的内容,我尝试了许多版本,但似乎无法在日常水平上总结这一点。除了每日求和之外,我还想运行 cummax 和累积平均值。

任何帮助都将不胜感激。

更新

我实际使用的代码如下:

z <- read.zoo(file = "data.csv", sep = ",", header = TRUE, stringsAsFactors = FALSE, blank.lines.skip = T, na.strings="NA", format = "%Y%m%d");

我对上述数字的(无意)引用似乎与实践中发生的情况相似,因为当我这样做时:

aggregate(z, index(z), sum)
#Error in Summary.factor(25L, na.rm = FALSE) : sum not meaningful for factors

有很多列(100 左右),我怎样才能将它们指定为 as.numeric 自动? (stringAsFactors = False 似乎不起作用?)

【问题讨论】:

    标签: r aggregate


    【解决方案1】:

    或者你在使用 zoo 之前进行聚合(不过 val1 和 val2 需要是数字)。

    x <- data.frame(dates = dates, val1=as.numeric(val1), val2=as.numeric(val2))
    y <- aggregate(x[,2:3],by=list(x[,1]),FUN=sum)
    

    然后将y 喂入动物园。

    你避免了警告:)

    【讨论】:

    • 甜蜜 - 我也能够让它适用于 CSV 数据(最终 :) 谢谢!
    【解决方案2】:

    你走在正确的道路上,但犯了几个错误。

    首先,zoo 只使用矩阵,而不是 data.frames。其次,那些需要数字输入:

    > z <- zoo(as.matrix(data.frame(val1=c(10,11,1,6), val2=c(5,31,2,7))), 
    +          order.by=as.Date(c("20100505","20100505","20100506","20100507"),
    +                           "%Y%m%d"))
    Warning message:
    In zoo(as.matrix(data.frame(val1 = c(10, 11, 1, 6), val2 = c(5,  :
      some methods for "zoo" objects do not work if the index entries in 
      'order.by' are not unique
    

    这给了我们一个动物园标准的警告:它不喜欢相同的时间索引。

    显示数据结构总是一个好主意,也可以通过str(),也可以在其上运行summary()

    > z
               val1 val2
    2010-05-05   10    5
    2010-05-05   11   31
    2010-05-06    1    2
    2010-05-07    6    7
    

    然后,一旦我们有了它,聚合就很容易了:

    > aggregate(z, index(z), sum)
               val1 val2
    2010-05-05   21   36
    2010-05-06    1    2
    2010-05-07    6    7
    > 
    

    【讨论】:

    • 但是zoo 消耗了我的data.frame! (因为 read.zoo 适用于 data.frames);-)
    • 谢谢 - 我想我现在离我更近了 :) 在我编写示例时,在引用数字时犯了一个愚蠢的错误,但实际上,我似乎是什么也发生在现实生活中的代码中。我已经更新了问题,仍然有点麻烦..
    【解决方案3】:

    val1val2 是字符串。 data.frame() 将它们转换为因子。对因素求和是没有意义的。您可能打算:

    x <- data.frame(dates = dates, val1=as.numeric(val1), val2=as.numeric(val2))
    z <- read.zoo(x, format = "%Y%m%d")
    aggregate(z, as.Date(time(z)), sum)
    

    产生:

               val1 val2
    2010-05-05   21   36
    2010-05-06    1    2
    2010-05-07    6    7
    

    【讨论】:

    • 谢谢 Joshua - 是否可以将它们全部指定为.numeric(如果导入 csv?)我已经更新了问题,我想第一个问题太简单了 :)
    【解决方案4】:

    将字符列转换为数字,然后使用read.zoo,利用其aggregate 参数:

    > x[-1] <- lapply(x[-1], function(x) as.numeric(as.character(x)))
    > read.zoo(x, format = "%Y%m%d", aggregate = sum)
                 val1 val2
    2010-05-05   21   36
    2010-05-06    1    2
    2010-05-07    6    7
    

    【讨论】:

      猜你喜欢
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多