R:按ID从嵌套列表中选择

时间:2015-06-29 13:43:38

标签: r list

我有一个嵌套列表,其中第一个术语包含ID,其他术语包含与该ID相关的特征:

list3  = list(list("a","b","c","d","e","f"), list(1:6), list(c(10,20,30,40,50,60))
list3

我想按ID从此列表中选择以获取与该ID相关联的字词: 我试过了:

ID="e"
listselect <- list3[list3[[1]]==ID]
listselect 

但这不起作用。 我希望得到与e相关的条款: listselect:e,5,50

我很感激你的帮助。

4 个答案:

答案 0 :(得分:4)

您可以继续:

x = 'e'

lapply(list3[-1], function(u) u[[1]][which(list3[[1]]==x)])

#[[1]]
#[1] 5

#[[2]]
#[1] 50

甚至更整洁:

rapply(list3[-1], `[[`, ...=which(list3[[1]]==x), how="unlist")

答案 1 :(得分:4)

Beauvel上校的答案很好,但我补充说:这是一个你真正需要data.frame而不是列表列表的情况。

# the data
list3  = list(list("a","b","c","d","e","f"), list(1:6), list(seq(10,60,10)))

# convert to data.frame and fix names
df3 <- data.frame(lapply(list3, unlist))
names(df3) <- paste0('v', 1:ncol(df3))

# now you can do this - so easy!
df3[df3[, 1] == 'e', ]

结果:

  v1 v2 v3
5  e  5 50

答案 2 :(得分:1)

也许你想要这个:

 list3  = list(list("a","b","c","d","e","f"), 1:6, 10*(1:6))

然后你可以得到这些:

 lidx <- list3[[1]]=="e"
 list3[[2]][lidx] 
 # [1] 5
 list3[[3]][lidx]
 # [1] 50

答案 3 :(得分:1)

您需要适当地索引列表以获得所需内容。您的命令listselect <- list3[list3[[1]]==ID]返回FALSE FALSE FALSE FALSE TRUE FALSE,这与返回“5”相同,因此当您索引list3[5]时,您将获得嵌套列表中的第五个列表,这在您的案例中不存在。如果您希望获得与e相关联的每个列表的一部分,则必须像c(list3[[2]][list3[[1]]==ID], list3[[3]][list3[[1]]==ID])中那样单独编制索引,或者像list3中一样循环list3[[i]][list3[[1]]==ID]的长度并保存那些列表选择你去。