Как построить матрицу из списка сопряжения имен со значениями

#list #r #matrix

#Список #r #матрица

Вопрос:

У меня есть список, подобный следующему:

 > l <- list(a=c("a1","a2"), b=c("b1","b2"), c="c1")
> l
$a
[1] "a1" "a2"

$b
[1] "b1" "b2"

$c
[1] "c1"
  

Я хотел бы преобразовать его обратно в матрицу, чтобы каждое значение было сопряжено с соответствующим именем. В этом примере ожидаемый результат:

      [,1] [,2]
[1,] "a"  "a1"
[2,] "a"  "a2"
[3,] "b"  "b1"
[4,] "b"  "b2"
[5,] "c"  "c1"
  

Каков наиболее эффективный способ достичь этого?

Ответ №1:

Не знаю, как наиболее эффективно, но используя ваш список:

 l <- list(a=c("a1","a2"), b=c("b1","b2"), c="c1")
  

мы можем получить длину каждого компонента, используя sapply()

 lens <- sapply(l, length)
  

мы просто повторяем имена l lens количество раз и отменяем перечисление l — здесь это делается в одной строке:

 cbind(rep(names(l), times = sapply(l, length)), unlist(l))
  

что дает желаемый результат:

 R> cbind(rep(names(l), times = sapply(l, length)), unlist(l))
   [,1] [,2]
a1 "a"  "a1"
a2 "a"  "a2"
b1 "b"  "b1"
b2 "b"  "b2"
c  "c"  "c1"
  

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

1. Ха, это редкий случай, когда можно побить «форсаж» @GavinSimpson в ответе! Но тогда вы потратили это дополнительное время на написание хорошего комментария.

2. @Andrie — да, мне нужно прекратить добавлять все дополнения к моим ответам, если я хочу победить вас, ребята, в эти дни 😉

3. Дело не в скорости! Я буду каждый раз отдавать предпочтение ответам с дополнениями над решениями «вырезать и вставить это»!

Ответ №2:

 cbind(rep(names(l), sapply(l, length)), unlist(l))

   [,1] [,2]
a1 "a"  "a1"
a2 "a"  "a2"
b1 "b"  "b1"
b2 "b"  "b2"
c  "c"  "c1"