我有与此示例类似的列表列表:
z <- list(list(num1=list((list(tab1=list(list(a=1, b=2, c=5), list(a=3, b=4), list(d=4,e=7)))))),list(num2=list((list(tab2=list(list(a=1, b=2), list(a=3, b=4)))))))
我想从列表名单的最后列表中提取数字:
所需的输出列表(因为1个列表条目更短)或者是与主列表对应的列的数据帧:
[1] a b c a b d e
[2] a b a b
数据帧:
column1 column2
a a
b b
c a
a b
b ""
d ""
e ""
我尝试了sapply(z, "[[", c("a","b"...)
的各种组合,但失败了,因为子列表名称有所不同。
编辑:抱歉,我需要的是实际值,而不是最后一个节点(字母)!此外,每个数值都有列名,未在上面的示例中设置;它是这样的:
[[1]]$num1[[1]]$tab1[[1]]$a
Name
1
所以期望的解决方案是值:
[1]
1 2 5 3 4 4 7
[2]
1 2 3 4
我实际上需要数值而不是字母。如果你可以调整你的解决方案,我将不胜感激。谢谢。
答案 0 :(得分:3)
z1 <- lapply(z, function(x) names(unlist(x)))
z1 <- lapply(z1, function(x) gsub(".*\\.", "", x))
n <- max(sapply(z1, length))
z1 <- lapply(z1, `length<-`, value = n)
setNames(as.data.frame(z1), paste0("Column", seq_along(z1)))
# Column1 Column2
#1 a a
#2 b b
#3 c a
#4 a b
#5 b <NA>
#6 d <NA>
#7 e <NA>
答案 1 :(得分:3)
尝试
lapply(z, function(x) as.numeric(unlist(x)))
## [[1]]
## [1] 1 2 5 3 4 4 7
##
## [[2]]
## [1] 1 2 3 4
答案 2 :(得分:1)
有点牵强,一切都很优雅,这是一种获得你想要的方式:
lista<-unlist(lapply(strsplit(names(unlist(z)),"\\."),function(vec) vec[3]))
names(lista)<-unlist(lapply(strsplit(names(unlist(z)),"\\."),function(vec) vec[1]))
uninames<-unique(names(lista))
res<-sapply(uninames,function(x,vec){vec[names(vec)==x]},lista)
> res
$num1
num1 num1 num1 num1 num1 num1 num1
"a" "b" "c" "a" "b" "d" "e"
$num2
num2 num2 num2 num2
"a" "b" "a" "b"
<强>更新强>
获取数字:
a<-unlist(z)
b<-names(unique(z))
res<-sapply(unique(b),function(name,vec,l_name){vec[l_name==name]},a,b)
>res
$num1
num1.tab1.a num1.tab1.b num1.tab1.c num1.tab1.a num1.tab1.b num1.tab1.d num1.tab1.e
1 2 5 3 4 4 7
$num2
num2.tab2.a num2.tab2.b num2.tab2.a num2.tab2.b
1 2 3 4