【问题标题】:Extract vector from list in R [duplicate]从R中的列表中提取向量[重复]
【发布时间】:2018-09-21 12:29:48
【问题描述】:

我一直在尝试这样做,但无法找到解决方案......

我有一个清单,比如说:

> a
[[1]]
[1] 10 30

[[2]]
[1] 15 20

[[3]]
[1] 12 15 30

$[[4]]
[1] 15 30 20

我想将第一个元素、第二个和第三个元素提取为向量。

我知道如何提取第一个和第二个元素:

first <- sapply(a, "[[", 1)
second <- sapply(a, "[[", 2)

但是当试图提取第三个时,我得到一个错误,因为列表中的一些向量中没有第三个元素。

我怎么能这样做?我应该在列表中只有两个值的向量中添加一个零吗?

【问题讨论】:

  • 试试sapply(a, tail, 1)
  • @Jimbou 那会给他们一个不同的结果,不是吗?
  • @docendodiscimus 啊,我明白了。 NA0 如果没有第三个值。
  • 当您提取“第三个”元素时,您希望结果是什么?
  • 最好得到零 0,而不是 NA。

标签: r list sapply


【解决方案1】:

由于您要对原子向量进行子集化,因此您应该使用[。然后,当您选择缺少的元素时,结果将自动为 NA。所以答案是:

sapply(a, `[`, 3)

这是一个例子:

a <- list(1:2, 3:4, 5:7, 8:10)
sapply(a, `[`, 3)
# [1] NA NA  7 10

【讨论】:

    【解决方案2】:

    另一种方法是用NA 填充列表,转置列表,并取消列出结果的元素

    lapply(transpose(lapply(a, `length<-`, max(lengths(a)))), unlist)
    

    尽管在评论中您说出于某种原因您希望填充与0 一起使用,而不是NA

    【讨论】:

      【解决方案3】:

      当您想要除NA 之外的其他值时,可以尝试此操作。否则使用答案 @docendo discimus

      sapply(list(a=1:2,b=1:3), function(x,y){
             if(length(x) < y) 0 else x[y]},3)
      a b 
      0 3 
      

      你也可以试试 tidyverse 解决方案

      library(tidyverse)
      map_int(list(a=1:2,b=1:3), function(x) coalesce(x[3],0L))
      a b 
      0 3 
      

      【讨论】:

      • 这个功能是我想要得到的。谢谢 ! !
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-08
      • 2018-10-13
      • 2021-09-14
      • 1970-01-01
      • 2015-10-02
      • 2019-04-18
      相关资源
      最近更新 更多