Проблемы в коде:
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