2017-07-27 65 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