Получение матрицы значений из матрицы с именами и списка со значениями

#r

#r

Вопрос:

У меня есть символьная матрица M1 с именами и именованный список L1 со значениями.

Я хочу создать матрицу M2 со значениями того же размера, что и M1. Для каждой ячейки в M2 должно быть значение, которое в L1 соответствует имени в M1. Ячейки, в которых имя M1 отсутствует в L1, M2 должны быть NA.

Я пытался это сделать, но мне это не удалось.

Вот пример того, что я хотел бы сделать.

 >M1
     [,1] [,2] [,3] [,4] 
[1,] "n1" "n4" "n7" "n10"
[2,] "n2" "n5" "n8" "n11"
[3,] "n3" "n6" "n9" "n12"

> L1
$n1
[1] 1

$n2
[1] 2

$n8
[1] 3

$n25
[1] 4
  

Оттуда M2 должно быть:

 > M2
     [,1] [,2] [,3] [,4]
[1,]    1   NA   NA   NA
[2,]    2   NA    3   NA
[3,]   NA   NA   NA   NA
  

Воспроизводимые примеры,

 dput(m1)
structure(c("n1", "n2", "n3", "n4", "n5", "n6", "n7", "n8", "n9", 
"n10", "n11", "n12"), .Dim = 3:4)

dput(L1)
structure(list(n1 = 1, n2 = 2, n8 = 3, n25 = 4), .Names = c("n1", 
"n2", "n8", "n25"))
  

Комментарии:

1. Не могли бы вы, пожалуйста, привести воспроизводимые примеры? Было бы проще помочь вам.

2. M1 и L1 — это данные, которые у меня есть. Это в основном как в примере: некоторые строки в M1. Имена в L1 соответствуют строкам в M1 (хотя некоторые есть, а некоторые нет). Я не совсем понимаю, как я мог бы помочь вам упростить задачу. Какая-то случайная функция, которая генерирует M1 и L1?

Ответ №1:

Один из способов unlist L1 — сопоставить имена с каждым элементом матрицы

 apply(m1, 1:2, function(i) unlist(L1)[match(i, names(L1))])

#      [,1] [,2] [,3] [,4]
#[1,]    1   NA   NA   NA
#[2,]    2   NA    3   NA
#[3,]   NA   NA   NA   NA
  

Ответ №2:

Мы также можем сделать это, заменив match ‘m1’ на names ‘L1’, чтобы получить индекс и использовать его для замены на ‘L1’ и изменения размеров

 `dim<-`(unlist(L1)[match(m1, names(L1))], dim(m1))
#     [,1] [,2] [,3] [,4]
#[1,]    1   NA   NA   NA
#[2,]    2   NA    3   NA
#[3,]   NA   NA   NA   NA