【问题标题】:Error in test[[1:3]] : recursive indexing failed at level 2测试 [[1:3]] 中的错误:递归索引在级别 2 失败
【发布时间】:2019-04-09 13:33:22
【问题描述】:

我是 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]

它显示以下错误

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

【问题讨论】:

  • 你可能需要sapply(test, [[, 1)
  • 这样称呼[[时不需要反引号吗?
  • 谢谢 ronak ..它的工作我做了这个 apply(test, "[[", 1)
  • 如果我想要列表中每个元素的前两个或多个值,现在该怎么办
  • 我有一个这样的向量 > a

标签: r list


【解决方案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

【讨论】:

  • 还有一个问题...我有一个这样的向量 > a
  • @mohitji 你可以使用matcha[!is.na(match(a, 4:7))],它只会返回有4:7的值。
【解决方案2】:

To quote from the documentation(强调我的):

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

换句话说,test[[1 : 3]] 并没有像你想象的那样做。相反,它尝试执行 recursive 子集,相当于写test[[1L]][[2L]][[3L]]

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

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

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

【讨论】:

    【解决方案3】:

    我们可以使用headlapply

    lapply(test, head, 3)
    #[[1]]
    #[1] 10 15 20
    
    #[[2]]
    #[1] 11 12 13
    
    #[[3]]
    #[1] 21 22 23
    

    或者使用来自purrrmap

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

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

    a[a %in% 4:7]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-17
      • 2019-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-08
      • 2014-09-14
      相关资源
      最近更新 更多