Создание и заполнение матрицы - PullRequest
0 голосов
/ 06 октября 2018

просто интересно, почему этот код не работает?Меня интересует, как использовать имена в выражении if.

mat <- matrix(, nrow = 3, ncol = 3)
row.names(mat) <- c("nc","sc","ny")
col.names(mat) <- c("BMW","Toyota","Honda")

for(row in 1:nrow(mat)) {

    for(col in 1:ncol(mat)) {

        if(colnames(mat1)[1] == "nc"){

            mat[row,col]=0

        }
        else {mat[row,col]=12}
    }

}   

Спасибо за тонну!

1 Ответ

0 голосов
/ 06 октября 2018

Проблемы в коде:

  • row.names должно быть colnames
  • col.names должно быть rownames
  • mat1должно быть mat
  • colnames(mat)[1] == "nc" всегда ИСТИНА или всегда ЛОЖЬ в зависимости от значения mat.Предположительно, вы хотите colnames(mat)[col] == "nc"

Собрав все это вместе, мы получим:

mat <- matrix(, nrow = 3, ncol = 3)
rownames(mat) <- c("BMW", "Toyota", "Honda")
colnames(mat) <- c("nc", "sc", "ny")

for(row in 1:nrow(mat)) {
  for(col in 1:ncol(mat)) {
    if(colnames(mat)[col] == "nc") {
      mat[row, col] <- 0
    } else {
      mat[row,col] <- 12
    }
  }
}

mat
##        nc sc ny
## BMW     0 12 12
## Toyota  0 12 12
## Honda   0 12 12

Также обратите внимание, что if можно упростить до:

mat[row, col] <- if (colnames(mat)[col] == "nc") 0 else 12

Альтернативы

1) Полностью векторизованная альтернатива Это может быть альтернативно выполнено в векторизованном, то есть без петель, виде:

mat2 <- matrix(12, nrow = 3, ncol = 3, 
  dimnames = list(c("BMW", "Toyota", "Honda"), c("nc", "sc", "ny")))
mat2[, "nc"] <- 0

identical(mat, mat2)
## [1] TRUE

2) Еще одна полностью векторизованная альтернатива Мы можем использовать следующую cbind.Требуется только одна строка кода.

mat3 <- cbind(nc = c(BMW = 0, Toyota = 0, Honda = 0), sc = 12, ny = 12)

identical(mat, mat3)
## [1] TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...