Проблема в том, как R заполняет матрицы столбцами.Вот простой пример, который иллюстрирует это:
mat1 <- matrix(1:9, ncol = 3)
mat2 <- matrix(1:9, ncol = 3)
mat2[-1, -1] <- mat1[1, -1]
mat2
> mat2
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 4 4
[3,] 3 7 7
mat1[1, -1]
- это вектор 4,7
, который, как вы можете видеть, R использовал для заполнения бита mat2
по столбцам.Вы хотели построчную операцию.
Одним из решений является репликация вектора замены столько раз, сколько требуется:
> mat2[-1, -1] <- rep(mat1[1, -1], each = nrow(mat1)-1)
> mat2
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 4 7
[3,] 3 4 7
Это работает, потому что вызов rep()
реплицирует каждое значение ввектор, когда мы используем аргумент "each"
вместо репликации (повторения) вектора:
> rep(mat1[1, -1], each = nrow(mat1)-1)
[1] 4 4 7 7
Поведение по умолчанию также даст неправильный ответ:
> rep(mat1[1, -1], nrow(mat1)-1)
[1] 4 7 4 7
Частичнопроблема, с которой вы сталкиваетесь, заключается также в том, что R расширяет аргументы до соответствующей длины для замены.R фактически и молча расширял вектор замены точно так же, как это делает rep(mat1[1, -1], nrow(mat1)-1)
, что в сочетании с принципом заполнения по столбцу давало поведение, которое вы видели.