показывать значения NA, когда индекс выходит за пределы привязки

#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. Можно сделать, и аналогичное можно было бы сделать для отсутствующих строк, хотя все еще надеюсь услышать, почему это было бы полезно.