2016-03-06 5 views
2

Что такое эффективный способ инвертирования списка векторов символов, как показано ниже?Инвертировать список векторов символов в R

Входные

lov <- list(v1=c("a", "b"), v2=c("a", "c"), v3=c("a")) 

Ожидаемое

list(a=c("v1", "v2", "v3"), b=c("v1"), c=c("v2")) 

Подобно Revert list structure, но с участием векторов:

ответ

3

Мы можем либо преобразующие list к data.frame (с использованием stack или melt от library(reshape2)) и затем split столбец «ind» с помощью «значений» в 'd1'.

d1 <- stack(lov) 
split(as.character(d1$ind), d1$values) 

Или, если выше метод является медленным, мы можем повторить (rep) names из «LOV» по length каждого list элемента (lengths дает vector выход length каждого элемента) и split его unlist В «любви».

split(rep(names(lov), lengths(lov)), unlist(lov)) 
+0

Второй предпочтительный, поскольку он не включает в себя добавленные пакеты – cannin

+1

@cannin. Первый также не нуждается в каких-либо пакетах. Я имел в виду «расплав», который исходит из 'reshape2'. В противном случае 'stack' является функцией' base R'. – akrun

Смежные вопросы