У меня есть вектор V с n элементами, каждый элемент может быть целым числом от 1 до N. Учитывая этот вектор, я хотел бы построить матрицу N × n W, в которой столбец i содержит частоты целых чисел от 1и N, как они появляются в подвекторе V [1: i].
Например, предположим, что N = 5 и n = 7, а V = c (3,1,4,1,2,1,4).Тогда моя матрица W будет иметь элементы
0,1,1,2,2,3,3
0,0,0,0,1,1,1
1,1,1,1,1,1,1
0,0,1,1,1,1,2
0,0,0,0,0,0,0
, поскольку целое число 1 (первая строка) появляется: 0 раз в V [1], один раз в V [1: 2], один раз в V [1: 3]дважды в V [1: 4], дважды в V [1: 5], три раза в V [1: 6], три раза в V [1: 7] и т. д.
Я мог бы этос циклом for
, используя table
и factor
, например:
N <- 5
n <- 7
V <- c(3,1,4,1,2,1,4)
W <- matrix(NA,N,n)
for(i in 1:n){
W[,i] <- as.vector(table(factor(V[1:i], levels=1:N)))
}
, что фактически дает
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 0 1 1 2 2 3 3
[2,] 0 0 0 0 1 1 1
[3,] 1 1 1 1 1 1 1
[4,] 0 0 1 1 1 1 2
[5,] 0 0 0 0 0 0 0
Но мне интересно, есть ли какой-нибудь более умный, более быстрый способв нем не используется цикл for: мои N и n имеют порядок 100 или 1000.
Любое другое понимание для улучшения кода выше также приветствуется (мои знания R по-прежнему очень просты).
Ура!