r语言 - 包含点的嵌套列表的名称(例如"c.2")



如何获取嵌套列表(包含数据框)的叶子名称

p <- list(a=1,b=list(b1=2,b2=3),c=list(c1=list(c11='a',c12='x'),c.2=data.frame("t"=1)))

转换成矢量格式:

[[1]]
[1] "a"
[[2]]
[1] "b" "b1"
[[3]]
[1] "b" "b2"
[[4]]
[1] "c" "c1" "c11"
[[5]]
[1] "c" "c1" "c12"
[[6]]
[1] "c" "c.2"

我的列表中包含带点的名字(例如"c.2")。通过使用unlist,可以得到"c.c.2",而我(也可能是strsplit)无法判断这个点是unlist的分隔符还是名称的一部分。这就是这个问题的区别。

应该忽略data.frames。到目前为止,我的方法是从这里改编的,但与unlist创建的点斗争:

listNames = function(l, maxDepth = 2) {
n = 0
listNames_rec = function(l, n) {
if(!is.list(l) | is.data.frame(l) | n>=maxDepth) TRUE
else { 
n = n + 1
# print(n)
lapply(l, listNames_rec, n)
}
}
n = names(unlist(listNames_rec(l, n)))
return(n)
}
listNames(p, maxDepth = 3)
[1] "a"        "b.b1"     "b.b2"     "c.c1.c11" "c.c1.c12" "c.c.2"  

像这样?

subnames <- function(L, s) {
if (!is.list(L) || is.data.frame(L)) return(L)
names(L) <- gsub(".", s, names(L), fixed = TRUE)
lapply(L, subnames, s)
}
res <- listNames(subnames(p, ":"), maxDepth = 3)
gsub(":", ".",
gsub(".", "$", res, fixed = TRUE),
fixed = TRUE
)
#[1] "a"        "b$b1"     "b$b2"     "c$c1$c11" "c$c1$c12" "c$c.2" 

不是一个完整的答案,但我想rrapply包可以帮助你在这里?一种选择是提取所有名称:

library(rrapply)
library(dplyr)
rrapply(p, how = "melt") %>% 
select(-value)
#   L1   L2   L3
# 1  a <NA> <NA>
# 2  b   b1 <NA>
# 3  b   b2 <NA>
# 4  c   c1  c11
# 5  c   c1  c12
# 6  c  c.2    t

这里的问题是data.frame名称也包含在上面,所以您可以单独提取它们:

#extract data frame name
rrapply(p, classes = "data.frame", how = "melt") %>% 
select(-value)
#   L1  L2
# 1  c c.2

那么你可以使用这两个数据集,也许可以提取重复的数据集,但保留数据框架名称

rrapply(p, how = "melt") %>%  
bind_rows(rrapply(p, classes = "data.frame", how = "melt")) 
#then filter etc...

一种方法可能是:

listNames = function(l, n, N) {
if(!is.list(l) | is.data.frame(l) | n<1) list(rev(N))
else unlist(Map(listNames, l, n=n-1, N=lapply(names(l), c, N)), FALSE, FALSE)
}
listNames(p, 3, NULL)
#[[1]]
#[1] "a"
#
#[[2]]
#[1] "b"  "b1"
#
#[[3]]
#[1] "b"  "b2"
#
#[[4]]
#[1] "c"   "c1"  "c11"
#
#[[5]]
#[1] "c"   "c1"  "c12"
#
#[[6]]
#[1] "c"   "c.2"

相关内容

最新更新