2014-12-12 4 views
1

У меня есть список списков, подобных этому образцу:Извлечь значения из списка списков с R

z <- list(list(num1=list((list(tab1=list(list(a=1, b=2, c=5), list(a=3, b=4), list(d=4,e=7)))))),list(num2=list((list(tab2=list(list(a=1, b=2), list(a=3, b=4))))))) 

Я хотел бы извлечь цифры из последнего списка имен списков:

Желаемая выход список (с 1 список записей короче) или как dataframe с колоннами, соответствующих основному списку:

[1] a b c a b d e 

[2] a b a b 

dataframe:

column1 column2 
a   a 
b   b 
c   a 
a   b 
b   "" 
d   "" 
e   "" 

Я пробовал различные комбинации sapply(z, "[[", c("a","b"...), но не смог, так как имена подписок различаются.

EDIT: Извините, мне нужны были фактические значения, а не последний узел (буквы)! Кроме того, каждое числовое значение имеет имя столбца, а не в приведенном выше примере; это так:

[[1]]$num1[[1]]$tab1[[1]]$a 
    Name 
    1 

Таким образом, искомое решение являются значения:

[1] 
1 2 5 3 4 4 7 
[2] 
1 2 3 4 

Я бы на самом деле нужно числовые значения вместо букв. Если бы вы могли приспособить свое решение к этому, я был бы благодарен. Благодарю.

ответ

1

Немного надуманно и все, но элегантный, вот способ получить то, что вы хотите:

lista<-unlist(lapply(strsplit(names(unlist(z)),"\\."),function(vec) vec[3])) 
names(lista)<-unlist(lapply(strsplit(names(unlist(z)),"\\."),function(vec) vec[1])) 
uninames<-unique(names(lista)) 

res<-sapply(uninames,function(x,vec){vec[names(vec)==x]},lista) 

> res 
$num1 
num1 num1 num1 num1 num1 num1 num1 
"a" "b" "c" "a" "b" "d" "e" 

$num2 
num2 num2 num2 num2 
"a" "b" "a" "b" 

UPDATE

Чтобы получить номера:

a<-unlist(z) 
b<-names(unique(z)) 
res<-sapply(unique(b),function(name,vec,l_name){vec[l_name==name]},a,b) 

>res 
$num1 
num1.tab1.a num1.tab1.b num1.tab1.c num1.tab1.a num1.tab1.b num1.tab1.d num1.tab1.e 
      1   2   5   3   4   4   7 

$num2 
num2.tab2.a num2.tab2.b num2.tab2.a num2.tab2.b 
      1   2   3   4 
+1

Я принимаю ваш ответ по ряду причин. (усилия и другие цели (обучение)). Большое спасибо! – Maximilian

+1

Спасибо! Но, конечно, для «второй версии» вашего вопроса, ответ Дэвида намного лучше ... – Cath

+1

Да, ответ Дэвида - это способ пойти на это. Его ответ остается на СО, так что это вопрос выбора. – Maximilian

3
z1 <- lapply(z, function(x) names(unlist(x))) 
z1 <- lapply(z1, function(x) gsub(".*\\.", "", x)) 
n <- max(sapply(z1, length)) 
z1 <- lapply(z1, `length<-`, value = n) 
setNames(as.data.frame(z1), paste0("Column", seq_along(z1))) 
# Column1 Column2 
#1  a  a 
#2  b  b 
#3  c  a 
#4  a  b 
#5  b <NA> 
#6  d <NA> 
#7  e <NA> 
3

Пробег:

lapply(z, function(x) as.numeric(unlist(x))) 

## [[1]] 
## [1] 1 2 5 3 4 4 7 
##  
## [[2]] 
## [1] 1 2 3 4 
+1

@docendodiscimus, довольно изменение внешнего вида/имени lol :) –

+3

@DavidArenburg, только закрывающая скобка от идеального ответа ... ;-) – Cath

+1

NO WAY! :) Это действительно окупается, думая в простоте! – Maximilian

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