2

我经常在循环内部进行循环,然后最后将列表融合到数据框以进行绘图。

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 个不同的列表名称保留为列名?

4

1 回答 1

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
于 2017-10-26T23:19:49.763 回答