解決方案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.
我沒有看到上面的任何'data.table'。但更重要的是目前還不清楚你想要什麼 - 請提供期望的輸出。 – eddi
抱歉不清楚問題。期望的輸出是每個滑動窗口,我想有排序值與外觀數(計數)。我可以讓我的dt進入dt1 <-data.table(dt) – kclick