使用R从列表列表中提取值

时间:2014-12-12 10:19:06

标签: r

我有与此示例类似的列表列表:

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

我实际上需要数值而不是字母。如果你可以调整你的解决方案,我将不胜感激。谢谢。

3 个答案:

答案 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