【问题标题】:How do I avoid the "some methods for “zoo” objects do not work if the index entries in ‘order.by’ are not unique"?如何避免“如果‘order.by’中的索引条目不唯一,‘zoo’对象的某些方法不起作用”?
【发布时间】:2019-08-10 08:38:21
【问题描述】:

我正在尝试找到一种方法来将一列附加到我的动物园对象而不会出现警告:

zoo(rval, index(x)[i]) 中的警告:“zoo”对象的一些方法 如果“order.by”中的索引条目不是唯一的,则不起作用

假设我有以下代码:

a <- read.zoo(data.frame(date=as.Date('2011-12-31') + 0:49, col1=seq(1,50), col2=seq(11,60)), FUN = as.Date)
mon <- read.zoo(data.frame(date=c(as.Date('2012-01-01'), as.Date('2012-02-01'), as.Date('2012-03-01')), mc=letters[1:3], mc2=LETTERS[1:3]), FUN = as.Date)

假设我想将index(mon) 附加到a 以便以后可以参考:

a$month <- as.numeric(index(mon[MATCH(as.yearmon( time(a)), as.yearmon(time(mon)))]))

这样做的正确方法是什么,所以我没有收到警告?

【问题讨论】:

  • 首先,不要使用 MATCH。这已经包含在先前的答案中。其次,如果您想将a 减少到年/月,请使用aggregate.zoo,例如aggregate(a, as.yearmon, mean)
  • @G.Grothendieck 我知道你不鼓励使用MATCH,但我想不出另一种方法。我认为在这种情况下我不能使用聚合,因为我没有聚合。我不是想简化为 yearmon,这只是我尝试对数据执行的操作的一个示例。我需要将mon 表中匹配列的值附加到a 表中,是的,它在a 表中不会是唯一的。问题不在于“只需将 a 中日期字段的 yearmon 填充到 month 列中”。我展示的只是一个更大项目的简单示例。
  • 想要的结果是什么?
  • 上面的代码给出了正确的结果。唯一的问题是警告。有没有办法在不收到警告的情况下获得相同的结果?
  • 在这种情况下,我收回关于比赛的评论。见答案。

标签: r zoo


【解决方案1】:

如果我理解正确,您想要 a 索引的第一个月的日期的数值,除非该年/月未出现在 mon 的索引中,并且在这种情况下您想要 NA .

mon.ym <- as.yearmon(index(mon))
a$month <- as.numeric(as.Date(mon.ym))[ match(as.yearmon(index(a)), mon.ym) ]

没有match 的替代方案是:

a.ym <- as.yearmon(index(a))
a$month <- ifelse(a.ym %in% as.yearmon(index(mon)), as.Date(a.ym), NA)

【讨论】:

    猜你喜欢
    • 2013-07-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2012-06-25
    • 2023-03-07
    相关资源
    最近更新 更多