2017-07-27 95 views
-3

假设我们有以下的载体:从迭代向量提取元素进一步的操作

x <- c(2, 13, 9, 12, 10, 19, 15, 17, 14, 3, 8, 20, 16, 4, 18, 6, 5, 1, 7, 11) 

由于是明显的,矢量,让我们把它叫做X,有20个观测。

现在,想象一下以下内容:

k = 3 

而且,我们要提取(I + K-1)X/2个元素,得到一个新的载体,把它叫做 “小X”。

这意味着,对于第一元件,I = 1,I将提取下列元件:

for i = 1, extract (1+3-1)/2 = 3/2 = 1.5 

换句话说,所述1.5th元件,其中,当舍入变为2,从而使元件我正在提取的实际上是i = 2,在这种情况下是13.

如何循环遍历向量并迭代应用相同的过程,最终得到一个包含每个(i + k) -1)/ 2个元素?

谢谢。

小编辑

这是要求的“小X”具有长度18 为什么的原因如下:

我有含第(i + K-中观察到的残留物的载体1)/ 2从滚动线性模型。这个向量长度为​​18,被称为“detrends”。

我想从X的(i + k-1)/ 2个元素中减去“detrends”以获得长度为18的第四个向量Y,称为“Y”。

因此,“detrends”和向量“小X”应该具有相等的长度。

我Y的结果应该是:

{8., 11.3333, 10.3333, 13.6667, 14.6667, 17., 15.3333, 11.3333, 8.33333, 
10.3333, 14.6667, 13.3333, 12.6667, 9.33333, 9.66667, 4., 4.33333, 6.33333} 

鉴于detrends是:

{5.0000000 -2.3333333 1.6666667 -3.6666667 4.3333333 -2.0000000 1.6666667 
2.6666667 -5.3333333 -2.3333333 5.3333333 2.6666667 -8.6666667 8.6666667 
-3.6666667 1.0000000 -3.3333333 0.6666667} 

考虑下面的一些评论,我发现的一些内容被复制过于频繁。虽然我得到了一些正确的数字,但它们并不正确。

有人能澄清我怎样才能得到所需的输出为Y,即:

{8., 11.3333, 10.3333, 13.6667, 14.6667, 17., 15.3333, 11.3333, 8.33333, 
10.3333, 14.6667, 13.3333, 12.6667, 9.33333, 9.66667, 4., 4.33333, 6.33333} 

其中:

Y = "little X" - "detrends" 

感谢。

编辑2

虽然Odysseus210提供在以上规定的问题的适当方法,有在我配制问题代码的方式的小的误差。事实上,我没有得到准确的订单的原因是因为我一直在寻找:

i +((k-1)/ 2))而不是(i + k-1)/ 2。这意味着Odysseus210的回答应该是:

x[sapply(1:(length(x) - 2), function(i) { i + round(((k - 1)/2)) })] 

请注意,在舍入步骤之前应该包括我。 此调整提供了我正在寻找的正确数字。

我想感谢大家的帮助,无论如何。

+0

不要循环。使用申请系列的其中一项功能。如'sapply()'。请参阅下面的答案。理解循环很好。但实际上,对于快速代码,请使用apply系列。 – Odysseus210

+0

'k < - 3; i < - c(1,10); x [round((i + k-1)/ 2)]' – Roland

+0

谢谢罗兰。你的答案有一些小问题,但直觉对我很好。 – Mattia

回答

0
x[sapply(1:(length(x) - 2), function(i) { round(((i + k - 1)/2)) })] 
+1

我想你需要遍历矢量长度的序列,而不是矢量本身。 – Sotos

+0

好眼睛!这是必要的。 – Odysseus210

+2

如果这给出了正确的结果,你可以简单地做'x [((seq_along(x)+ k-1)/ 2)]'。不需要循环。 – Roland