2016-09-21 6 views
2

Ich mache oft Schleifen innerhalb von Schleifen und dann am Ende schmelzen die Listen zu einem Datenrahmen für die grafische Darstellung.Benennung geschmolzen iterativ gemappten Listen in der Tidyverse

ac<-list("BB","AA") 
ca<-list(a=c(1,2,3),b=c(6,5,4)) 
cc<-map(a,function(y) map(ca,~paste0(.x,y))) 
reshape2::melt(cc) 

Q1: Gibt es eine andere Art und Weise von Karten innerhalb von Karten zu tun, ohne

jedoch zu function(y) zurückgreifen, da oft meine Listen unbenannte sind neige ich dazu, die Werte der Liste als Namen hinzuzufügen, wie folgt:

Das resultierende df hat die Namen L2 und L1 und ich würde es vorziehen, wenn die Namen ca bzw. ac wären.

nam.cons<-NULL 
map_test2<-function(list_in,...){ 
    nam.cons<<-c(nam.cons,deparse(substitute(list_in))) 

    if (is.null(names(list_in))){ 
    names(list_in)<-list_in 
    } 
    map(list_in,...) 
} 

cc3=map_test2(ac,function(y) map_test2(ca,~paste0(.x,y))) 
cc4<-reshape2::melt(cc3) 
names(cc4)<-c("value",rev(unique(nam.cons))) 

Jetzt kann dies sehr schnell unübersichtlich werden, wenn ich die nam.cons Variable zurückgesetzt vergessen. Ich könnte 1,2,3,4..n Versionen davon in separaten Funktionen erstellen, aber

Q2: Ist es möglich, eine melt_map-Funktion zu erstellen, die beide erlauben würde, über n-verschiedene Listen und dass am Ende auch die n-verschiedenen Listennamen als Spaltennamen beibehalten werden?

Antwort

2

Wir möchten jede Kombination von Listenelementen elegant durchlaufen, ohne unsere Listennamen zu verlieren.

Lassen Sie uns also alle Kombinationen bauen und bereits die Namen speichern:

library(tidyverse)    # data 
ac<-list("BB","AA")    # 
ca<-list(a=c(1,2,3),b=c(6,5,4)) # 

df <- merge(tibble(ac),tibble(ca)) 

# ac  ca 
# 1 BB 1, 2, 3 
# 2 AA 1, 2, 3 
# 3 BB 6, 5, 4 
# 4 AA 6, 5, 4 

Dann sind wir bereit zu spielen und tun, was wir ohne doppelte Verwendung von Karten und Ersatz Anrufe schmerzlos im ordentlichen Weise wollen, Zum Beispiel:

df %>% 
    mutate(ac=unlist(ac), 
     name =names(ca)) %>% 
    unnest %>% 
    mutate(value = paste0(ca,ac)) 

# ac name ca value 
# 1 BB a 1 1BB 
# 2 BB a 2 2BB 
# 3 BB a 3 3BB 
# 4 AA a 1 1AA 
# 5 AA a 2 2AA 
# 6 AA a 3 3AA 
# 7 BB b 6 6BB 
# 8 BB b 5 5BB 
# 9 BB b 4 4BB 
# 10 AA b 6 6AA 
# 11 AA b 5 5AA 
# 12 AA b 4 4AA