【问题标题】:R: Why my vector is disordered?R:为什么我的向量是无序的?
【发布时间】:2010-11-25 12:28:50
【问题描述】:

假设我有这个动物园矢量

mine <- zoo(c(rep(0,4),rep(1,4),rep(0,5),rep(1,23),rep(0,4),rep(1,2)),as.chron(seq(1:42)))

我想以某种顺序提取几个元素

> mine[14]
01/15/70 
       1 
> mine[5]
01/06/70 
       1 
> mine[41]
02/11/70 
       1 

它有效! 但现在我尝试用不同的方式来做这件事

zz <- c(14, 5, 41)
mine[zz]

01/06/70 01/15/70 02/11/70 
       1        1        1 

我不知道为什么我得到它的顺序不同。 我怎样才能保持我想要的顺序,我的列表顺序?? 我不介意它是一个列表、一个向量、按列还是按行,但我想按照我要求的顺序来获取它。

干杯

【问题讨论】:

  • 请尽量提供可复现的代码,本示例需要R中的zoo包和chron包,在未说明的环境中未指定版本
  • 使用repeach 参数来避免重复调用它,例如rep(rep.int(0:1, 3), each = c(4, 4, 5, 23, 4, 2))

标签: r vector zoo


【解决方案1】:

为什么 zoo 这样做的答案是它有一个函数 [ ([.zoo) 的方法,它从子集的值创建一个新的 zoo 对象,它在逻辑上想要重新排序以便它是一个有效的动物园对象。

您可以通过相关的访问器函数访问时间索引和数据来实现您想要的:

> index(mine)[c(14, 5, 41)]
[1] 01/15/70 01/06/70 02/11/70
> coredata(mine)[c(14, 5, 41)]
[1] 1 1 1

如果您想将其合并为一个步骤,请编写您自己的乐趣:

myExtract <- function(x, want) {
    out <- coredata(mine)[want]
    names(out) <- index(x)[want]
    out
}

这给出了:

> myExtract(mine, want = c(14, 5, 41))
01/15/70 01/06/70 02/11/70 
       1        1        1

【讨论】:

  • 非常感谢。像这样简单(但重要)的事情会使代码失败
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
  • 2016-11-09
相关资源
最近更新 更多