[英]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.frame
或data.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.