#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"