#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