从列表中提取数据而不使用R中的循环

时间:2012-10-14 21:21:38

标签: r vector matrix

我有一个带行位置的向量v:

v<-c(10,3,100,50,...)

使用那些位置我想提取列表的元素,修改列,例如让我假设我的列号是2,所以我在做:

data<-c()
data<-c(list1[[v]][[2]])

list1具有以下格式的数据:

[[34]]
      [1] "200_s_at" "483"        "1933"        "3664"        

因此,例如,我想从行342中仅提取值1910,第2列,并对下一行执行相同操作

但是当我想这样做时我遇到了错误,是否可以直接进行?或者我应该有一个循环,逐个读取v中的位置并填充数据向量,如:

#algorithm
for i<-1 to length(v)
    pos<-v[i]
    data[[i]]<-c(list1[[pos]][[2]])
next i

由于

1 个答案:

答案 0 :(得分:7)

您可以使用sapply,如下所示:

sapply(list1[v], `[`, 2)

但是,根据您的数据,您可能会收到意外的输出,如Why is `vapply` safer than `sapply`?中所述。例如,如果您的某些列表项的长度大于&lt; 2?如果某些列表项不是向量而是data.frames会怎么样?此外,输出类可能会根据列表元素的类别(逻辑,整数,数字,字符)而有所不同。例如,如果您希望所有列表项都是长度> = 2的字符向量,那么更安全:

vapply(list1[v], `[`, character(1), 2)

其中vapply会仔细检查您的假设,如果发现问题则会出错。