【问题标题】:Group by period.apply() in xts在 xts 中按 period.apply() 分组
【发布时间】:2017-04-04 21:33:34
【问题描述】:

您好,我有一个带有 4 个变量(2 个 id 变量和 2 个度量)的 xts 对象:

> head(mi_xts)

                     squareId country     smsIN     smsOUT
2013-12-01 00:00:00     9999      39 0.4953734 0.93504713
2013-12-01 00:10:00     9999      39 0.1879042 0.50057622
2013-12-01 00:20:00     9996      39 0.5272736 0.25643745
2013-12-01 00:30:00     9996      39 0.0965593 0.25249854
2013-12-01 00:40:00     9999      39 1.2104980 0.49123277
2013-12-01 00:50:00     9999      39 0.4756599 0.09913715

我想使用一个 period.apply,它每天按 squareId(我不关心国家/地区)返回 smsIN 和 smsOUT 组的平均值。 我刚刚写了这段代码:

days <- endpoints(mi_xts, on = "days")
mi_xts.1d<- period.apply(mi_xts, INDEX = days, FUN = mean)

但显然我只得到 1 行结果:

                    squareId country     smsIN    smsOUT
2013-12-01 23:50:00   9995.5      39 0.8418086 0.6644908

有什么建议吗?

【问题讨论】:

    标签: r xts


    【解决方案1】:

    您需要通过"squareId"split 聚合在一起,然后使用apply.daily 聚合,然后将rbind 聚合在一起。

    s <- split(mi_xts, mi_xts$squareId)
    a <- lapply(s, function(x) apply.daily(x, mean))
    r <- do.call(rbind, a)
    

    【讨论】:

    • 好的,但我还获得了 squareId 处理后的值,例如 9996.160、9995.500。我试图将该字段强制为字符,但是当我切开时,我得到“端点错误(x,on = f,k = k):不支持的“on”参数”
    • @andriatz:你不能创建一个列字符。 xts 对象是具有时间属性的矩阵,您不能像使用 data.frame 那样在矩阵中混合类型。当我使用您的示例数据时,我不会得到奇怪的 squareId 值。也许在您的问题中向对象添加更多行(请使用dput())。
    • 我实际上正在处理一个大型数据集 (400 mb)。 squareId 是一个整数 Id 列,范围为 1 到 1000。我需要找到每个 sqaureId 的每日平均值。
    • @andriatz:我知道数据很大。但我不明白如何将数据按整数拆分成块并在输出中获得非整数平均值。
    • @andriatz: to.period() 创建 OHLC 数据。这肯定不是你想要的……?您在问题中使用了period.apply()apply.daily() 只是 period.apply() 的包装,所以没有理由它应该导致整数值。 split()/lapply()/rbind() 解决方案适用于任何接受矩阵并返回具有相同列数的标量或 1 行矩阵的函数。
    猜你喜欢
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    相关资源
    最近更新 更多