[英]Extract names of deeply nested lists
假設我有一個這樣的列表:
m <- list('a' = list('b' = c(1, 2), 'c' = 3, 'b1' = 4))
我想獲取m
的名稱並保持水平。
如果我做
names(unlist(m))
它給出輸出
"a.b1" "a.b2" "a.c" "a.b1"
但是我只想要像
"a.b" "a.c" "a.b1"
如何獲得?
同樣, unlist()
對於大的嵌套列表來說也是一項昂貴的操作。 有沒有辦法不用unlist()
並以更快的方式做到這一點?
Example 2 :
p = list( 'a' = list( 'z' = c( 1, 2 ), 'g' = list( 'i' = 2, 'j' = 3 ) ), 'd' = list( 'k' = c( 4, 5 ) ) )
Example 3 :
p = list( 'a' = list( 'z' = c( 1, 2 ), 'g' = list( 2, 3 ) ), 'd' = list( 'k' = c( 4, 5 ) ) )
您可以通過遞歸地僅提取列表中每個向量的第一個元素並獲取該結構的名稱來到達那里:
names(rapply(m, function(x) head(x, 1)))
#[1] "a.b" "a.c" "a.b1"
這是具有更復雜的輸入列表的示例:
m <- list(a=list(b=c(1, 2), c=3, b1=list(x=1, y=2:4)), x=list(a=1,b=2), c=4:8)
str(m)
# List of 3
# $ a:List of 3
# ..$ b : num [1:2] 1 2
# ..$ c : num 3
# ..$ b1:List of 2
# .. ..$ x: num 1
# .. ..$ y: int [1:3] 2 3 4
# $ x:List of 2
# ..$ a: num 1
# ..$ b: num 2
# $ c: int [1:5] 4 5 6 7 8
names(rapply(m, function(x) head(x, 1)))
#[1] "a.b" "a.c" "a.b1.x" "a.b1.y" "x.a" "x.b" "c"
對於OP的第二個輸入,將產生:
p <- list('a' = list('z' = c(1, 2), 'g' = list('i' = 2, 'j' = 3)), 'd' = list('k' = c(4, 5)))
names(rapply(p, function(x) head(x, 1)))
#[1] "a.z" "a.g.i" "a.g.j" "d.k"
您的列表m
具有此結構。
> str(m)
List of 1
$ a:List of 3
..$ b : num [1:2] 1 2
..$ c : num 3
..$ b1: num 4
如您所見,您想將頂級列表的名稱與第二級列表的名稱連接起來。 您可以通過paste0(names(m), ".", names(m[[1]][1:3]))
或僅通過paste0(names(m), ".", names(m[[1]][1:3]))
方式實現此paste0(names(m), ".", names(m[[1]][1:3]))
:
> paste0(names(m), ".", names(m[[1]][]))
[1] "a.b" "a.c" "a.b1"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.