簡體   English   中英

R取消列表更改名稱

[英]R unlist changes names

鑒於以下列表:

l <- list("foo123"=c(1:3), "foo456"=5, "foo789"=8)
print(l)
#  $foo123
#  [1] 1 2 3
#  
#  $foo456
#  [1] 5
#  
#  $foo789
#  [1] 

當我unlist()列表unlist()列表時,如果它們是重復的,則名稱會附加整數。

unlist(l)
#  foo1231 foo1232 foo1233  foo456  foo789 
#        1       2       3       5       8 

我想保留名稱,所以use.names=FALSE並不理想。 是否在幫助頁面的任何位置解釋了此行為? 可以修改嗎?

可以將unlist配置為保留名稱,以便我的結果是:

#  foo123 foo123 foo123 foo456 foo789 
#       1      2      3      5      8

我們可以嘗試在不公開后設置名稱。 我們還使用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

但請注意,在大多數情況下,重復的名稱會導致歧義和可能的錯誤。 舉個例子,如果我們現在嘗試使用名稱"foo123"進行子集,則R僅輸出第一個實例:

o <- setNames(unlist(l, use.names=F),rep(names(l), lengths(l)))
o["foo123"]
#  foo123
#       1

這並不完全回答您的問題,但您可以考慮的替代方案是從list轉到“長” data.framedata.table

這可以通過在基礎R中stack或從“reshape2”或“data.table” melt而容易地實現。

例:

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

然后,如果你真的想要一個命名向量,你總是可以這樣做:

o <- data.table::melt(l)
setNames(o$value, o$L1)
# foo123 foo123 foo123 foo456 foo789 
#      1      2      3      5      8 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM