鉴于以下列表:
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)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           3461 次  |  
        
|   最近记录:  |