test [[1:3]]中的错误:级别2的递归索引失败

时间:2019-04-09 13:33:23

标签: r list

我是R的新手,并且将列表设置如下:

test<-list(c(10,15,20,25),c(11,12,13,14),c(21,22,23,24))

test

[[1]]
[1] 10 15 20 25

[[2]]
[1] 11 12 13 14

[[3]]
[1] 21 22 23 24

现在我正在这样做

test<-test[[1:3]][1]

其显示以下错误

  

test [[1:3]]中的错误:递归索引在2级失败

3 个答案:

答案 0 :(得分:1)

要从每个列表中选择多个值,可以使用sapply / lapply。例如,要从列表中选择前3个值,您可以

lapply(test, `[`, 1:3)

#[[1]]
#[1] 10 15 20

#[[2]]
#[1] 11 12 13

#[[3]]
#[1] 21 22 23

或者使用sapply,您将获得相同的结果,但采用矩阵形式,其中每一列代表列表中的值。

sapply(test, `[`, 1:3)
#     [,1] [,2] [,3]
#[1,]   10   11   21
#[2,]   15   12   22
#[3,]   20   13   23

答案 1 :(得分:0)

To quote from the documentation(重点是我):

  

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

换句话说,test[[1 : 3]]并没有达到您想像的那样。而是尝试执行递归子设置,这等效于编写test[[1L]][[2L]][[3L]]

如注释中所建议,您需要按照lapply(test, `[[`, 1L)的方式执行某些操作,以将列表中的每个向量子集化。要将结果作为向量而不是列表,请将调用包装在unlist中,或使用vapply

vapply(test, `[[`, numeric(1L), 1L)

您也可以使用sapply代替后者,但是要注意,此函数以并非总是显而易见的方式强制其返回值,因此容易出错。最好将它的使用限制为交互式会话。

答案 2 :(得分:0)

我们可以将headlapply一起使用

lapply(test, head, 3)
#[[1]]
#[1] 10 15 20

#[[2]]
#[1] 11 12 13

#[[3]]
#[1] 21 22 23

或使用map中的purrr

library(purrr)
map(test, head, 3)

对于子集向量值,我们可以使用%in%

a[a %in% 4:7]