2016-03-21 39 views
1

我對rollapplywidth選項的理解是,它指定了函數將在其上運行的窗口大小,並且by選項指定此窗口的移位大小。這是我的數據集:即確認關於動物園的幾個問題:: rollapply

> dataset <- as.vector(t(cbind(5:1, 1:5))) 
> dataset 
[1] 5 1 4 2 3 3 2 4 1 5 

這裏是一個例子,我已經寫了上面:

> w3b3 <- rollapply(dataset, width = 3, by=3, FUN = print, align="left") 
[1] 5 1 4 
[1] 2 3 3 
[1] 2 4 1 

> w3b2 <- rollapply(dataset, width = 3, by=2, FUN = print, align="left") 
[1] 5 1 4 
[1] 4 2 3 
[1] 3 3 2 
[1] 2 4 1 

> w2b3 <- rollapply(dataset, width = 2, by=3, FUN = print, align="left") 
[1] 5 1 
[1] 2 3 
[1] 2 4 

> w3b1 <- rollapply(dataset, width = 3, by=1, FUN = print, align="left") 
[1] 5 1 4 
[1] 1 4 2 
[1] 4 2 3 
[1] 2 3 3 
[1] 3 3 2 
[1] 3 2 4 
[1] 2 4 1 
[1] 4 1 5 

# ACCORDING OT MAN WHEN NO VALUE IS USED THEN by=1 (SAME AS ABOVE) 
> w3b1 <- rollapply(dataset, width = 3, FUN = print, align="left") 
[1] 5 1 4 
[1] 1 4 2 
[1] 4 2 3 
[1] 2 3 3 
[1] 3 3 2 
[1] 3 2 4 
[1] 2 4 1 
[1] 4 1 5 

> w1b1 <- rollapply(dataset, width = 1, by=1, FUN = print, align="left") 
[1] 5 
[1] 1 
[1] 4 
[1] 2 
[1] 3 
[1] 3 
[1] 2 
[1] 4 
[1] 1 
[1] 5 

儘管我有幾個問題:

1)爲什麼這樣一個返回錯誤而max(20)正在運行?一切都是相同的,所不同print最後一個例子是替換max

> w1b1 <- rollapply(dataset, width = 1, by=1, FUN = max, align="left") 
Error in if (is.na(a) || is.na(rval[i = 1]) || a == rval[i - 1]) max(xc[(i - : 
    missing value where TRUE/FALSE needed 

如何調試這些類型的*apply家庭功能錯誤?

2)在with選項中使用大於1的向量的目的是什麼?以及爲什麼後面的代碼打印一個數字以輸出奇數位置,但將奇數位置的兩個數字分配給w12變量?

> w12 <- rollapply(dataset, width = c(1,2), FUN = print, align="left") 
[1] 5 
[1] 1 4 
[1] 4 
[1] 2 3 
[1] 3 
[1] 3 2 
[1] 2 
[1] 4 1 
[1] 1 
> w12 
     [,1] [,2] 
[1,] 5 5 
[2,] 1 4 
[3,] 4 4 
[4,] 2 3 
[5,] 3 3 
[6,] 3 2 
[7,] 2 2 
[8,] 4 1 
[9,] 1 1 

# SAME AS ABOVE (ACCORDING TO MAN by IS USED ONLY IF width IS OF LENGTH 1) 
> w12 <- rollapply(dataset, width = c(1,2), by=10, FUN = print, align="left") 
[1] 5 
[1] 1 4 
[1] 4 
[1] 2 3 
[1] 3 
[1] 3 2 
[1] 2 
[1] 4 1 
[1] 1 
> w12 
     [,1] [,2] 
[1,] 5 5 
[2,] 1 4 
[3,] 4 4 
[4,] 2 3 
[5,] 3 3 
[6,] 3 2 
[7,] 2 2 
[8,] 4 1 
[9,] 1 1 

3)通過向量和列表width參數之間的區別是什麼(相比以前的輸出,這是完全不同的)?

> rollapply(dataset, width = list(1,2), FUN = print, align="left") 
[1] 1 
[1] 2 
[1] 2 
[1] 3 
[1] 3 
[1] 4 
[1] 4 
[1] 5 
[1] 5 
[1] 1 2 2 3 3 4 4 5 5 

4)by.column是做什麼的?我期待它與矩陣有關,所以我嘗試了以下內容:

> mtrx <- matrix(c(1:30), nrow=10) 
> mtrx 
     [,1] [,2] [,3] 
[1,] 1 11 21 
[2,] 2 12 22 
[3,] 3 13 23 
[4,] 4 14 24 
[5,] 5 15 25 
[6,] 6 16 26 
[7,] 7 17 27 
[8,] 8 18 28 
[9,] 9 19 29 
[10,] 10 20 30 

# THIS IS OK 
> rollapply(mtrx, width = 2, by = 2, FUN = max, align = "left", by.column=T) 
    [,1] [,2] [,3] 
[1,] 2 12 22 
[2,] 4 14 24 
[3,] 6 16 26 
[4,] 8 18 28 
[5,] 10 20 30 

# BUT WHAT IS THIS? 
> rollapply(mtrx, width = 2, by = 2, FUN = max, align = "left", by.column=F) 
[1] 22 24 26 28 30 
+1

你應該嘗試限制你的帖子每個問題,例如,因爲我可以給你一些提示,但不是所有的問題:1)不確定,bu有趣的是,min沒有錯誤地工作; 2)變量窗口; 3)不確定; 4)??; 5)最後一個例子是給你的最大行數爲2的窗口,所以用min或median再次嘗試,看看會發生什麼 – rawr

+0

@rawr謝謝你的回覆。你能否試着進一步解釋2,4(作爲更正前的5)作爲答案?謝謝。 –

回答

0

(1)可能是一個錯誤。

(2)和(3)中的幫助文件中解釋:

如果寬度是一個純數字向量其元素被視爲寬度 與對齊相結合來解釋,如果寬度是而列表 其組件被視爲偏移量。在上述情況下,如果寬度的長度爲1,則寬度將循環用於每個點。如果 寬度是列表,其分量表示整數偏移,使得列表的第i個分量指的是位置i + 寬度[[i]]上的時間點。如果這些點中的任何一點低於1或高於 索引(數據)的長度,則不對該點評估FUN,除非部分= TRUE,並且在這種情況下僅傳遞有效點。

所以對於第一w12c(1, 2)指定寬度被再循環到的dataset的長度,使得交替的應用將是的寬度1和2

因此,第一W12相同其下面寬度爲1,寬度爲2,然後再使用1,等等。

rollapply(dataset, c(1, 2, 1, 2, 1, 2, 1, 2, 1, 2), print) 

如果width指定一個名單,然後其成分被視爲偏移,而不是寬度。 1表示下一個值,2表示下一個值之後的值,-1表示之前的值,等等。

對於列表示例,它被回收到list(1, 2, 1, 2, 1, 2, 1, 2, 1, 2),因此對於第一個應用程序它使用下一個值,對於第二個應用程序它使用下一個值之後的值,對於第三個應用程序它再次使用下一個值,因此上。

(4)by.column在幫助文件中定義:

by.column - 邏輯。如果爲TRUE,FUN將分別應用於每列。

缺省值爲TRUE,所以默認情況下,它被應用到每一列,然後結果一起被綁定在一起。否則所有列都會立即傳遞給該函數。

+0

我已經多次讀過幫助,但我不是英語母語的人,所以我沒有理解2,3,4(在修正前曾經是5)。你可以嘗試解釋而不是引用幫助嗎?謝謝。 –

+0

已添加一些說明。請注意,在幫助文件末尾有很多示例,我建議您仔細閱讀它們,因爲大部分示例不僅有解釋,還有示例說明。 –

0

1也工作:

dataset <- as.vector(t(cbind(5:1, 1:5))) 
rollapply(dataset, width = 1, by=1, FUN = max, align="left") 

[1] 5 1 4 2 3 3 2 4 1 5

與寬度2

rollapply(dataset, width = 2, by=1, FUN = max, align="left") 

[1] 5 4 4 3 3 3 4 4 5