【问题标题】:How to extract elements from a list with mixed elements如何从具有混合元素的列表中提取元素
【发布时间】:2012-09-21 15:17:13
【问题描述】:

我在 R 中有一个包含以下元素的列表:

[[812]]
[1] ""             "668"          "12345_s_at" "667"          "4.899777748" 
[6] "49.53333333"  "10.10930207"  "1.598228663"  "5.087437057" 

[[813]]
[1] ""            "376"         "6789_at"  "375"         "4.899655078"
[6] "136.3333333" "27.82508792" "2.20223398"  "5.087437057"

[[814]]
[1] ""             "19265"        "12351_s_at" "19264"        "4.897730912" 
[6] "889.3666667"  "181.5874908"  "1.846451572"  "5.087437057" 

我知道我可以使用 list_elem[[814]][3] 之类的东西访问它们,以防我想提取位置 814 的第三个元素。 我需要提取所有列表的第三个元素,例如12345_s_at,并且我想将它们放入向量或列表中,以便稍后将它们的元素与另一个列表进行比较。以下是我的代码:

elem<-(c(listdata))
lp<-length(elem)
for (i in 1:lp)
{
    newlist<-c(listdata[[i]][3]) ###maybe to put in a vector
    print(newlist)
 }

当我打印结果时,我得到第三个元素,但像这样:

  [1] "1417365_a_at"
  [1] "1416336_s_at"
  [1] "1416044_at"
  [1] "1451201_s_at"

所以我不能用像newlist[3] 这样的索引来遍历它们,因为它返回NA。我的错在哪里?

【问题讨论】:

    标签: r list vector


    【解决方案1】:

    如果你想提取每个列表元素的第三个元素,你可以这样做:

    List <- list(c(1:3), c(4:6), c(7:9))
    lapply(List, '[[', 3)  # This returns a list with only the third element
    unlist(lapply(List, '[[', 3)) # This returns a vector with the third element
    

    使用您的示例并考虑您可以执行的@GSee 评论:

    yourList <- list(c("","668","12345_s_at","667", "4.899777748","49.53333333",
           "10.10930207", "1.598228663","5.087437057"),
         c("","376", "6789_at",  "375",  "4.899655078","136.3333333",
           "27.82508792", "2.20223398",  "5.087437057"),
         c("", "19265", "12351_s_at", "19264", "4.897730912",
           "889.3666667", "181.5874908","1.846451572","5.087437057" ))
    
    sapply(yourList, '[[', 3)
    [1] "12345_s_at" "6789_at"    "12351_s_at"
    

    下次您可以使用 dput 对您的部分数据集提供一些数据,以便我们轻松重现您的问题。

    【讨论】:

    • 使用sapply 避免unlist 部分。另外,我认为[ 就足够了。 +1
    • 您也可以在此处使用pluck 而不是[[,这只会使其与实际动词一起更具可读性。
    【解决方案2】:

    使用purrr,您可以提取元素并确保数据类型一致性:

    library(purrr)
    
    listdata <- list(c("","668","12345_s_at","667", "4.899777748","49.53333333",
           "10.10930207", "1.598228663","5.087437057"),
         c("","376", "6789_at",  "375",  "4.899655078","136.3333333",
           "27.82508792", "2.20223398",  "5.087437057"),
         c("", "19265", "12351_s_at", "19264", "4.897730912",
           "889.3666667", "181.5874908","1.846451572","5.087437057" ))
    
    map_chr(listdata, 3)
    ## [1] "12345_s_at" "6789_at"    "12351_s_at"
    

    还有其他 map_ 函数也可以强制类型一致性,而 map_df() 最终可以帮助结束 do.call(rbind, …) 的疯狂。

    【讨论】:

      【解决方案3】:

      如果您想使用您在问题中输入的代码,以下是修复方法:

      listdata <- list(c("","668","12345_s_at","667", "4.899777748","49.53333333",
             "10.10930207", "1.598228663","5.087437057"),
           c("","376", "6789_at",  "375",  "4.899655078","136.3333333",
             "27.82508792", "2.20223398",  "5.087437057"),
           c("", "19265", "12351_s_at", "19264", "4.897730912",
             "889.3666667", "181.5874908","1.846451572","5.087437057" ))
      
      v <- character() #creates empty character vector
      list_len <- length(listdata)
      for(i in 1:list_len)
          v <- c(v, listdata[[i]][3]) #fills the vector with list elements (not efficient, but works fine)
      
      print(v)
      [1] "12345_s_at" "6789_at"    "12351_s_at"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-15
        • 2016-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多