鉴于以下列表:
l <- list("foo123"=c(1:3), "foo456"=5, "foo789"=8)
print(l)
# $foo123
# [1] 1 2 3
#
# $foo456
# [1] 5
#
# $foo789
# [1]
Run Code Online (Sandbox Code Playgroud)
当我unlist()在列表中时,如果名称是重复的,则名称会附加整数.
unlist(l)
# foo1231 foo1232 foo1233 foo456 foo789
# 1 2 3 5 8
Run Code Online (Sandbox Code Playgroud)
我想保留名字,所以use.names=FALSE不理想.是否在帮助页面的任何位置解释了此行为?可以修改吗?
可以将unlist配置为保留名称,以便我的结果是:
# foo123 foo123 foo123 foo456 foo789
# 1 2 3 5 8
Run Code Online (Sandbox Code Playgroud)
Pie*_*une 15
我们可以尝试在不公开后设置名称.我们还使用use.names=FALSE避免创建和重写名称向量(MartinMorgan):
setNames(unlist(l, use.names=F),rep(names(l), lengths(l)))
#foo123 foo123 foo123 foo456 foo789
# 1 2 3 5 8
Run Code Online (Sandbox Code Playgroud)
但请注意,在大多数情况下,重复的名称会导致歧义和可能的错误.举个例子,如果我们现在尝试使用名称"foo123"R输出子集只输出第一个实例:
o <- setNames(unlist(l, use.names=F),rep(names(l), lengths(l)))
o["foo123"]
# foo123
# 1
Run Code Online (Sandbox Code Playgroud)
这并不能完全回答您的问题,但您可以考虑的另一种选择是从 alist变为“长”data.frame或data.table.
这很容易stack在基础 R 或melt“reshape2”或“data.table”中实现。
例子:
stack(l)
# values ind
# 1 1 foo123
# 2 2 foo123
# 3 3 foo123
# 4 5 foo456
# 5 8 foo789
library(data.table)
melt(l)
# value L1
# 1 1 foo123
# 2 2 foo123
# 3 3 foo123
# 4 5 foo456
# 5 8 foo789
Run Code Online (Sandbox Code Playgroud)
然后,如果你真的想要一个命名向量,你总是可以这样做:
o <- data.table::melt(l)
setNames(o$value, o$L1)
# foo123 foo123 foo123 foo456 foo789
# 1 2 3 5 8
Run Code Online (Sandbox Code Playgroud)