Заполните матрицу в R - PullRequest
       1

Заполните матрицу в R

1 голос
/ 09 января 2020

У меня есть матрица с заполненным нижним треугольником, и я хочу заполнить верхний треугольник матрицы соответствующими значениями нижнего треугольника.

Код, который я пробовал:

    r <-  read.table("rcorrected.csv", header = TRUE, sep = ",", check.names = FALSE)
    m <- as.matrix(r)


m[upper.tri(m, diag = FALSE)] <- m[lower.tri(m, diag= FALSE)]

Вывод:

Warning message:
In m[upper.tri(m, diag = FALSE)] <- m[lower.tri(m, diag = FALSE)] :
  number of items to replace is not a multiple of replacement length


    structure(m)
            1    2    3    4    5    6    7    8    9   10   11   12
 [1,]  1 1.00   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
 [2,]  2 0.50 1.00   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
 [3,]  3 0.57 0.50 1.00   NA   NA   NA   NA   NA   NA   NA   NA   NA
 [4,]  4 0.00 0.04 0.16 1.00   NA   NA   NA   NA   NA   NA   NA   NA

dput(head(m[, c(2,1)]))
    structure(c(1, 0.5, 0.57, 0, 0, 0.23, 1, 2, 3, 4, 5, 6), .Dim = c(6L, 
    2L), .Dimnames = list(NULL, c("1", "")))

Матрица m читается как список?

Ответы [ 2 ]

2 голосов
/ 09 января 2020

Здесь мы присваиваем с неодинаковым количеством наблюдений: diag = TRUE на правой стороне присвоения, а также diag = TRUE должно быть внутри lower.tri, а не вне функции

m[upper.tri(m, diag = FALSE)] <- m[lower.tri(m, diag= FALSE)]
1 голос
/ 09 января 2020

Если m - это матрица, подобная той, что показана в примечании в конце с заполненным нижним треугольником, то она также заполняет верхнюю часть tri angular.

m2 <- m + t(m)
m2
##      [,1] [,2] [,3] [,4]
## [1,]    0    5    9   13
## [2,]    5    0   10   14
## [3,]    9   10    0   15
## [4,]   13   14   15    0

Если диагональ m не равна 0, сделайте это следующим образом:

m + t(m) - diag(diag(m))

Примечание

m <- matrix(c(0, 5, 9, 13, 0, 0, 10, 14, 0, 0, 0, 15, 0, 0, 0, 0), 4)
m
##      [,1] [,2] [,3] [,4]
## [1,]    0    0    0    0
## [2,]    5    0    0    0
## [3,]    9   10    0    0
## [4,]   13   14   15    0

Если мы начинаем с фрейм данных DF, затем сначала используйте as.matrix для его преобразования.

DF <- structure(list(V1 = c(0, 5, 9, 13), V2 = c(0, 0, 10, 14), V3 = c(0, 
0, 0, 15), V4 = c(0, 0, 0, 0)), class = "data.frame", row.names = c(NA, 
-4L))
m <- as.matrix(DF)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...