我有一个嵌套列表,其中第一个术语包含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
我很感激你的帮助。
答案 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]
的长度并保存那些列表选择你去。