我有一组嵌套列表,如:
setoflists <- list(first.list = list(letter.a=1, letter.b=2, letter.c=3),
second.list = list(letter.d=4, letter.e=5, letter.f=6))
我想把它平铺成一个列表。但是,我希望列表中对象的名称首先是子列表,然后是顶级列表,中间用下划线"_"分隔。一个原因是我的列表名称中已经有很多句号(.)了。
我可以像这样用unlist
来平化列表:
newlist <- unlist(setoflists, use.names = T, recursive = F)
但是产生的名字是top list,然后是sublist,用".">
> names(newlist)
[1] "first.list.letter.a" "first.list.letter.b" "first.list.letter.c" "second.list.letter.d" "second.list.letter.e"
[6] "second.list.letter.f"
我要的格式是:
letter.a_first.list
letter.b_first.list ...
我不认为有一种方法来控制使用当前的方法,因为它调用make.names()
作为unlist()
的一部分。之后可能需要重命名:
names(newlist) <- unlist(Map(paste, lapply(setoflists, names), names(setoflists), sep = "_"))
names(newlist)
[1] "letter.a_first.list" "letter.b_first.list" "letter.c_first.list" "letter.d_second.list" "letter.e_second.list"
[6] "letter.f_second.list"
regex
的一个解决方案,遵循@ritchie-sacramento的第一个想法:
setoflists <- list(firstlist = list(letter.a=1, letter.b=2, letter.c=3),
secondlist = list(letter.d=4, letter.e=5, letter.f=6))
newlist <- unlist(setoflists, use.names = T, recursive = F)
names(newlist) <- sub("(.*)(?:[.])(letter.+)", "\2_\1", names(newlist))
names(newlist)
输出:
> names(newlist)
[1] "letter.a_first.list" "letter.b_first.list" "letter.c_first.list" "letter.d_secondlist" "letter.e_secondlist" "letter.f_secondlist"