如何根据R中的列表索引向量从列表中提取值

如何根据R中的列表索引向量从列表中提取值,r,list,R,List,虚拟示例: 1> L = vector('list',100)#prefill empty list 1> for (i in 1:100){ 1+ L[[i]]$letter = letters[rgeom(1,.5)+1]#populate it with a letter 1+ L[[i]]$number = runif(1)#and a number 1+ } 1> i = ceiling(runif(100,0,100))#an (arbitrary) vector

虚拟示例:

1> L = vector('list',100)#prefill empty list
1> for (i in 1:100){
1+ L[[i]]$letter = letters[rgeom(1,.5)+1]#populate it with a letter
1+ L[[i]]$number = runif(1)#and a number
1+ }
1> i = ceiling(runif(100,0,100))#an (arbitrary) vector of indices
1> x = L[[i]]$letter #I want the ith letter
Error in L[[i]] : no such index at level 2
我希望
x
包含
L
I
th元素的
letter
对象。(
i
的顺序与
x
的索引顺序无关)

没有循环的好方法是什么

以下是“我的编辑器”中的“复制/粘贴”,而不是“终端”窗口,供那些可能会觉得更容易的人使用:

L = vector('list',100)
for (i in 1:100){
    L[[i]]$letter = letters[rgeom(1,.5)+1]
    L[[i]]$number = runif(1)
}
i = ceiling(runif(100,0,100))
x = L[[i]]$letter

相关文档位于
帮助(“[[”)

[
[
$
之间最重要的区别在于
[
可以选择多个元素,而其他两个可以选择单个元素

因此,我们需要使用
L[i]
提取值

从那里,要访问
L[i]
的每个元素的
$letter
部分,我们可以使用
sapply

sapply(L[i], `[[`, "letter")
在这里使用
$
而不是
[[
很有诱惑力,但是


这里是构建示例数据的另一种方法

set.seed(1)
L = replicate(100, list(
  letter = letters[rgeom(1,.5)+1], 
  number = runif(1)
), simplify = FALSE)
i = sample(100, 100, replace=TRUE)

在随机生成的示例之前放置一个
集合是非常有用的。种子
,这样每个人都在看同一件事。

您的
1>
+
位于行的开头,这会让复制粘贴和尝试您的code@Frank你觉得怎么样?当然,谢谢。问题似乎是:
i
是一个向量,而不是一个数字而
[[]]
只接受一个数字。如果您想获取每个数字的
字母,请使用sapply(L[i],`[[`,“字母”)
应该行得通。不确定这是否是你想要的。确实是。你想回答这个问题,并解释为什么引用几个brakets是有意义的,我完全接受。