【问题标题】:zoo object aggregation动物园对象聚合
【发布时间】:2011-12-14 01:22:30
【问题描述】:

尊敬的社区,

我收到的数据将在一个数据框中:

Var_1      Var_2         Date        VaR_3  VaR_4   VaR_5   Var_6
1           4       2010-01-18         7    apple    10    sweet
2           5       2010-07-19         8    orange   11    sour
3           6       2010-01-18         9    kiwi     12    juicy
...        ...      ...               ...   ...     ...    ... 

我想使用 zoo,因为它似乎是一个灵活的对象类。我刚从 R 开始,我试图阅读包的描述(小插图)。

问题:

  1. 给定以上数据作为数据框,建议用哪种方法将完整的df转换成zoo对象,告诉zoo应该使用第三列作为日期列(日期可以在数据中出现多次)?
  2. 如何使用 zoo 内置函数每月聚合所有其他列,除了第 4 列和第 6 列? zoo 是否能够自动丢弃分类变量而只使用那些适合聚合的列?
  3. 如何每月汇总所有数字列,针对第 4 列中的每个类别(第 6 列不应包括在内,因为它不是数字)。

感谢您的支持。

【问题讨论】:

  • 似乎适用于问题 1:df.z

标签: r dataframe zoo


【解决方案1】:

zoo 对象是时间序列,通常是数字向量或矩阵。似乎您真正拥有的是一堆不同的时间序列,其中第 5 列标识了它是哪个序列。即有苹果系列、橙系列、猕猴桃系列等,每个系列都有几列。

删除最后一列,因为它不是数字,使用第三列作为索引并在第 5 列上拆分:

# create test data
Lines <- "Var_1      Var_2         Date        VaR_3  VaR_4   VaR_5   Var_6
1           4       2010-01-18         7    apple    10    sweet
2           5       2010-07-19         8    orange   11    sour
3           6       2010-01-18         9    kiwi     12    juicy"
cat(Lines, "\n", file = "data.txt")

library(zoo)
z <- read.zoo("data.txt", header = TRUE, index = 3, split = "VaR_5",
  colClasses = c(Var_6 = "NULL"))

结果是:

> z
           Var_1.apple Var_2.apple VaR_3.apple VaR_5.apple Var_1.kiwi
2010-01-18           1           4           7          10          3
2010-07-19          NA          NA          NA          NA         NA
           Var_2.kiwi VaR_3.kiwi VaR_5.kiwi Var_1.orange Var_2.orange
2010-01-18          6          9         12           NA           NA
2010-07-19         NA         NA         NA            2            5
           VaR_3.orange VaR_5.orange
2010-01-18           NA           NA
2010-07-19            8           11

以上假设对于第 5 列的给定值,日期是唯一的。如果不是这种情况,则包含aggregate = mean 参数或aggregate 的其他值。

现在将其汇总为我们拥有的每月动物园系列:

aggregate(z, as.yearmon, mean)

也可以使用FUN = as.yearmon 参数直接将其转换为每月:

zm <- read.zoo("data.txt", header = TRUE, index = "Date", split = "VaR_4", 
  FUN = as.yearmon, colClasses = c(Var_6 = "NULL"), aggregate = mean)

请参阅?read.zoovignette("zoo-read")?aggregate.zoo 以及其他小插曲和帮助文件。

【讨论】:

  • 亲爱的 Gabor,感谢您的回复和周到的建议。实际上,我的数据集更复杂。对于这个例子,我以某种方式减少了数据框,以便它显示最重要的属性。将使用哪一列进行拆分是未知的。还有更多包含数字或类别的列。使用您的方法,当我想跨动物园对象执行聚合时,我必须手动对它们进行排序。有没有办法对每一列使用逻辑测试,以便总结并只保留动物园对象的那些包含数字数据的列?
  • 进一步澄清一下:在第一步中,我想按照所有数据的描述进行聚合。第二步是按类别划分。每个类别都有可能在同一日期出现条目。不过这应该没问题,因为在大多数情况下,我想确定每个月的总和、平均值和绝对计数。
  • 我认为您假设该对象具有数字和非数字列。 zoo 对象基于向量或矩阵,不能包含不同类的混合。在这种情况下,它们都应该是数字。目前尚不清楚要拆分的列是什么意思。最后你必须知道它是什么。您可以将数据读入 data.frame 并在数据帧上使用 read.zoo(read.zoo 的第一个 arg 可以是数据帧)。如果您愿意,可以使用不同的拆分多次执行此操作以获得不同的动物园对象。
  • “动物园...不能包含不同类别的混合物”:如果我在数据上使用 df.z
  • 您的第二条评论“最终您将不得不知道它是什么”是正确的,但这是在我对数据进行了所有调查之后,我不知道最终会是哪一个用过的。因此,在第一步中,我想要对所描述的所有数据进行聚合。我的问题似乎仍然是开放的:“有没有办法在每一列上使用逻辑测试,以便它总结并只保留动物园对象的那些列(来自数据框),包含数字数据?”
猜你喜欢
  • 2012-02-27
  • 2013-05-15
  • 1970-01-01
  • 2015-02-16
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
  • 2019-07-14
相关资源
最近更新 更多