2016-09-21 19 views
2

Я часто делаю петли внутри циклов, а затем в конце тает списки в графику для графического отображения., назвав расплавленные итеративно отображенные списки в 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: Есть ли другой способ сделать карты внутри карт, не прибегая к function(y)

Однако, так как мои списки часто неназванный я, как правило, добавить значения в списке как имя следующим образом:

map_test<-function(list_in,...){ 
    if (is.null(names(list_in))){ 
    names(list_in)<-list_in 
    } 
    map(list_in,...) 
} 
cc2=map_test(ac,function(y) map_test(ca,~paste0(.x,y))) 
df=reshape2::melt(cc2) 

В результате df имеет имена L2 и L1, и я предпочел бы, чтобы имена были ca и ac соответственно.

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))) 

Теперь это может запутаться очень быстро, если я забыл сбросить переменную nam.cons. Я мог бы создавать версии 1,2,3,4..n этого в отдельных функциях, но

Q2: Возможно ли создать одну функцию melt_map, которая позволила бы принимать цикл за n-разные списки и что в конце концов также сохранить n-разные имена списков в качестве имен столбцов?

ответ

2

Мы хотим прокрутить каждую комбинацию элементов списка, элегантно и без потери имен наших списков.

Так давайте строить все комбинации и сохранить имена уже:

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 

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

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