#r #matrix
Вопрос:
Допустим, у меня есть матрица ниже
Mat = matrix(1:16, nrow = 4, ncol = 4, dimnames = list(as.character(1:4), as.character(16:19)))
Теперь допустим, я хочу получить его столбец для 2 имен, т. е.
Mat[, c('16', '1')]
С этим я получаю низкую ошибку:
Error in Mat[, c("16", "1")] : subscript out of bounds
Есть ли какой-либо способ вернуть NA
значения для недоступных столбцов?
Спасибо за ваш вклад.
Комментарии:
1. Лучший способ сделать это-использовать какую-то функцию для попытки индексирования, а затем поместить в нее команду try/catch. Но я думаю, что более важный вопрос заключается в том, почему вы хотите это сделать?
2. что — то в этом роде
Mat[, which(c('16', '1') %in% colnames(Mat) == TRUE)]
. в противном случае это несколько запутанная попытка, но я не знаю, каков ваш вариант использования. В самом деле, почему?3. Причина, по которой мне нужно это сделать, в основном заключается в сопоставлении моей матрицы на основе широкого внешнего вектора (здесь
x
). У меня есть разные матрицы с разными строками и столбцами, и мне нужно, чтобы они выглядели одинаково с одинаковыми столбцами и строками. Надеюсь, это прояснит ситуацию.
Ответ №1:
Хотя это действительно странная вещь, вот способ, которым вы могли бы это сделать:
Mat <- matrix(1:16, nrow = 4, ncol = 4, dimnames = list(as.character(1:4), as.character(16:19)))
getColumns <- function(Mat, indicies) {
mat_cols <- colnames(Mat)
missing <- indicies[!(indicies %in% mat_cols)]
present <- indicies[(indicies %in% mat_cols)]
result <- cbind(
Mat[, present],
matrix(NA, nrow = nrow(Mat), ncol = length(missing))
)
colnames(result) <- c(present, missing)
return(result)
}
> getColumns(Mat, c("1", "2", "17", "19"))
17 19 1 2
1 5 13 NA NA
2 6 14 NA NA
3 7 15 NA NA
4 8 16 NA NA
Комментарии:
1. Можно сделать, и аналогичное можно было бы сделать для отсутствующих строк, хотя все еще надеюсь услышать, почему это было бы полезно.