我是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级失败
答案 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)
我们可以将head
与lapply
一起使用
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]