【问题标题】:How to subset from a list in R如何从R中的列表中提取子集
【发布时间】:2012-03-26 07:41:10
【问题描述】:

我有一个相当简单的任务,但没有找到好的解决方案。

> mylist  
[[1]]
 [1]  1  2  3  4  5  6  7  8  9 10

[[2]]
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"

[[3]]
[1] 25 26 27 28 29 30 31 32

y <- c(3,5,9)    

我想从 mylist 中提取列表中每个组件的子元素 3、5 和 9。 我已经尝试过,sapply[mylist,"[[",y] 但不是运气!以及其他类似 vapply、lapply 等。在此先感谢您的帮助

毛里西奥·奥尔蒂斯

【问题讨论】:

    标签: r list sapply


    【解决方案1】:

    尝试使用[ 而不是[[(具体取决于您实际需要lapply)。

    来自?'[['

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

    【讨论】:

      【解决方案2】:

      你可以使用sapply(mylist, "[", y):

      mylist <- list(1:5, 6:10, 11:15)
      sapply(mylist, "[", c(2,3))
      

      【讨论】:

        【解决方案3】:

        有更好的方法可以做到这一点,但这里有一个快速的解决方案。

        # your values
        list1<-1:10
        list2<-letters[1:26]
        list3<-25:32
        
        # put 'em together in a list
        mylist<-list(list1,list2,list3)
        
        # function
        foo<-function(x){x[c(3,5,9)]}
        
        # apply function to each of the element in the list
        foo(mylist[[1]])
        foo(mylist[[2]])
        foo(mylist[[3]])
        
        # check the output
        
        > foo(mylist[[1]])
        [1] 3 5 9
        > foo(mylist[[2]])
        [1] "c" "e" "i"
        > foo(mylist[[3]])
        [1] 27 29 NA
        

        【讨论】:

        • 请使用lapply,现在这个解决方案在mylist变大时根本无法扩展。
        【解决方案4】:

        使用lapply

        # create mylist
        list1<-1:10
        list2<-letters[1:26]
        list3<-25:32
        mylist<-list(list1,list2,list3)
        
        # select 3,5,9th element from each list
        list.2 <- lapply(mylist, function(x) {x[c(3,5,9)]})
        

        【讨论】:

          【解决方案5】:

          purrr 为解决 tidyverse 中的此类列表操作提供了另一种解决方案

          library(purrr)
          library(dplyr)
          
          desired_values <- c(1,3)
          
          mylist <- list(1:5, letters[1:6], 11:15) %>% 
          purrr::map(`[`,desired_values) 
          
          mylist
          

          【讨论】:

            【解决方案6】:

            我认为 sgibb 的回答没有给出你想要的。我建议制作一个新功能:

            subsetList <- function(myList, elementNames) {
                lapply(elementNames, FUN=function(x) myList[[x]])
            }
            

            那么你可以这样使用它:

            x <- list(a=3, b="hello", c=4.5, d="world")
            subsetList(x, c("d", "a"))
            subsetList(x, c(4, 1))
            

            这些都给了

            [[1]]
            [1] "world"
            
            [[2]]
            [1] 3
            

            这就是你想要的,我想。

            【讨论】:

            • 我使用了这个解决方案,但由于某种原因,它为每个元素添加了一个包含索引的列。非常混乱。
            【解决方案7】:

            对列表的重复命名元素进行子集化的简单方法,类似于此处的其他答案。

            这样我下次查这个问题时可以找到它

            例如,从重复列表中子集"b" 元素,其中每个元素都包含"a""b" 子元素:

            mylist <- list(
              list(
                "a" = runif(3),
                "b" = runif(1)
              ),
              list(
                "a" = runif(3),
                "b" = runif(1)
              )
            )
            
            mylist
            #> [[1]]
            #> [[1]]$a
            #> [1] 0.7547490 0.6528348 0.2339767
            #> 
            #> [[1]]$b
            #> [1] 0.8815888
            #> 
            #> 
            #> [[2]]
            #> [[2]]$a
            #> [1] 0.51352909 0.09637425 0.99291650
            #> 
            #> [[2]]$b
            #> [1] 0.8407162
            
            blist <- lapply(
              X = mylist,
              FUN = function(x){x[["b"]]}
            )
            
            blist
            #> [[1]]
            #> [1] 0.8815888
            #> 
            #> [[2]]
            #> [1] 0.8407162
            

            reprex package (v0.3.0) 于 2019 年 11 月 6 日创建

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-07-23
              • 2020-07-10
              • 1970-01-01
              • 2018-12-01
              • 2021-10-04
              • 1970-01-01
              • 2014-07-08
              • 2014-02-13
              相关资源
              最近更新 更多