Решение 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]
есть строка для каждого применения f
в столбце i, и столбцы в этой строке подсчитывают количество 0, 1, ..., 5.
Другая возможность - это то, что дает те же 5 матриц (по одной на входной столбец) в качестве компонентов результирующего списка:
lapply(dt, rollapply, 3, f)
Например, рассмотрим следующее. Строка 1 вывода говорит, что первое применение f к dt[,1]
имеет один 0, две единицы и никаких других значений. Это также можно получить от 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 вывода, есть один 0 и две единицы в dt[1:3,1]
. Глядя на ячейку 2,1 вывода, мы видим, что в dt[2:4,1]
есть один 0, один 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.
person
G. Grothendieck
schedule
24.01.2014
data.table
выше. Но что еще более важно, непонятно, чего вы хотите - пожалуйста, предоставьте желаемый результат. - person eddi   schedule 24.01.2014