2014-01-24 51 views
1

我有時間系列數據作爲data.table類和每列(觀察點)有值,我想在滑動窗口(30寬度)內計數它們。 我試圖用rle(sort(x))來計算rollapply中的每個值,但它不起作用。rollapply與函數rle(x)

例如,如果我有表像下面,

dt <- data.frame(v1=c(1,0,1,4,4,4,4,4),v2=c(1,1,1,4,3,3,3,3), 
      v3=c(0,1,1,3,3,3,3,2),v4=c(1,1,0,3,3,3,3,3), 
     v5=c(1,1,1,5,5,5,5,5)) 

我試圖這樣;

rollapply(dt, 3, function(x) {rle(sort(x))$values; rle(sort(x))$length}) 

但結果只是沒有意義。 請給我一些指導...

+0

我沒有看到上面的任何'data.table'。但更重要的是目前還不清楚你想要什麼 - 請提供期望的輸出。 – eddi

+0

抱歉不清楚問題。期望的輸出是每個滑動窗口,我想有排序值與外觀數(計數)。我可以讓我的dt進入dt1 <-data.table(dt) – kclick

回答

2

解決方案1 ​​假設目標是讓3個值的滾動計數嘗試以下操作:

m <- as.matrix(dt) 
levs <- sort(unique(c(m))) 
f <- function(x) table(factor(x, levs)) 
r <- rollapply(m, 3, f) 

這裏levs是0,1,..., 5因此,對於函數的每個應用,我們將得出一個向量6,長度爲0,1,...,5的計數。有5個輸入列,所以對每列應用這樣的函數可以得到5 * 6 = 30列的輸出。

請注意,rollapply與矩陣或動物園對象,而不是數據框,所以我們轉換它。爲了確保每個函數應用程序輸出相同長度的向量,我們將每個輸入轉換爲具有相同級別的因子。

注意的是:

ra <- array(r, c(6, 6, 5)) 

給出了一個三維陣列,其中RA [,, i]爲通過rollapply(dt[, i], 3, f)形成的基質。也就是說,在矩陣ra[,,i]中,列i上的每個應用程序f都有一行,該行中的列計算0,1,...,5的數量。

另一種可能性是這可以得到相同的5點矩陣(每個輸入柱之一)所得到的列表的部件:

lapply(dt, rollapply, 3, f) 

例如,考慮以下。輸出的第1行表示在dt[,1]上的第一個f應用程序有一個0,1兩個1,沒有其他值。這也可以從r[,,1]或從 lapply(dt, rollapply, 3, f)[[1]]獲得:

> rollapply(dt[, 1], 3, f) 
    0 1 2 3 4 5 
[1,] 1 2 0 0 0 0 <- dt[1:3,1] has 1 zero and 2 ones 
[2,] 1 1 0 0 1 0 <- dt[2:4,1] has 1 zero and 1 one and 1 four, etc. 
[3,] 0 1 0 0 2 0 
[4,] 0 0 0 0 3 0 
[5,] 0 0 0 0 3 0 
[6,] 0 0 0 0 3 0 

溶液2

這是說查看輸出的電池1,1,該存在dt[1:3,1]一個0和兩個1。縱觀我們看到有一個0,一個1和dt[2:4,1] 1四個等等

> g <- function(x) { tab <- table(x); toString(paste(names(tab), tab, sep = ":")) } 
> sapply(dt, rollapply, 3, g) # or rollapply(m, 3, g) where m was defined in solution 1 
    v1    v2    v3   v4    v5   
[1,] "0:1, 1:2"  "1:3"   "0:1, 1:2" "0:1, 1:2"  "1:3"  
[2,] "0:1, 1:1, 4:1" "1:2, 4:1"  "1:2, 3:1" "0:1, 1:1, 3:1" "1:2, 5:1" 
[3,] "1:1, 4:2"  "1:1, 3:1, 4:1" "1:1, 3:2" "0:1, 3:2"  "1:1, 5:2" 
[4,] "4:3"   "3:2, 4:1"  "3:3"  "3:3"   "5:3"  
[5,] "4:3"   "3:3"   "3:3"  "3:3"   "5:3"  
[6,] "4:3"   "3:3"   "2:1, 3:2" "3:3"   "5:3"  

增加了輸出的電池2,1:進一步討論和解決方案2.

+0

謝謝你的答案。但是很難解釋結果。我真正想要得到的是 - 如果我只是使用上面的dt數據使用5寬度滑動窗口。對於第一個滑動窗口的v1列,第一個滑動窗口中的第一個滑塊有2個計數,0的1,4的2,1的1,0,1,4的3個計數。等等。因此,當我簡單地運行rle(sort(x))x作爲簡單的向量時,您將得到結果排序值與總計數。這就是我想要的滑動窗口,但是......我不知道爲什麼rle函數在rollapply函數中沒有很好地應用 – kclick

+0

問題中的代碼問題是給予'rollapply'的函數返回輸出不同的長度取決於輸入值,所以不能將結果變成矩形。我已經添加了額外的討論和第二個解決方案。 –

+0

這是非常有幫助的。我會盡力消化所有問題,並讓你知道如果我對你的方法有更多疑問。 – kclick