How can I remove an element from a list?

前端 未结 16 1387
傲寒
傲寒 2020-11-28 01:21

I have a list and I want to remove a single element from it. How can I do this?

I\'ve tried looking up what I think the obvious names for this function would be in

相关标签:
16条回答
  • 2020-11-28 01:39

    In the case of named lists I find those helper functions useful

    member <- function(list,names){
        ## return the elements of the list with the input names
        member..names <- names(list)
        index <- which(member..names %in% names)
        list[index]    
    }
    
    
    exclude <- function(list,names){
         ## return the elements of the list not belonging to names
         member..names <- names(list)
         index <- which(!(member..names %in% names))
        list[index]    
    }  
    aa <- structure(list(a = 1:10, b = 4:5, fruits = c("apple", "orange"
    )), .Names = c("a", "b", "fruits"))
    
    > aa
    ## $a
    ##  [1]  1  2  3  4  5  6  7  8  9 10
    
    ## $b
    ## [1] 4 5
    
    ## $fruits
    ## [1] "apple"  "orange"
    
    
    > member(aa,"fruits")
    ## $fruits
    ## [1] "apple"  "orange"
    
    
    > exclude(aa,"fruits")
    ## $a
    ##  [1]  1  2  3  4  5  6  7  8  9 10
    
    ## $b
    ## [1] 4 5
    
    0 讨论(0)
  • 2020-11-28 01:43

    If you have a named list and want to remove a specific element you can try:

    lst <- list(a = 1:4, b = 4:8, c = 8:10)
    
    if("b" %in% names(lst)) lst <- lst[ - which(names(lst) == "b")]
    

    This will make a list lst with elements a, b, c. The second line removes element b after it checks that it exists (to avoid the problem @hjv mentioned).

    or better:

    lst$b <- NULL
    

    This way it is not a problem to try to delete a non-existent element (e.g. lst$g <- NULL)

    0 讨论(0)
  • 2020-11-28 01:45

    if you'd like to avoid numeric indices, you can use

    a <- setdiff(names(a),c("name1", ..., "namen"))
    

    to delete names namea...namen from a. this works for lists

    > l <- list(a=1,b=2)
    > l[setdiff(names(l),"a")]
    $b
    [1] 2
    

    as well as for vectors

    > v <- c(a=1,b=2)
    > v[setdiff(names(v),"a")]
    b 
    2
    
    0 讨论(0)
  • 2020-11-28 01:46

    Just wanted to quickly add (because I didn't see it in any of the answers) that, for a named list, you can also do l["name"] <- NULL. For example:

    l <- list(a = 1, b = 2, cc = 3)
    l['b'] <- NULL
    
    0 讨论(0)
  • 2020-11-28 01:50

    Use - (Negative sign) along with position of element, example if 3rd element is to be removed use it as your_list[-3]

    Input

    my_list <- list(a = 3, b = 3, c = 4, d = "Hello", e = NA)
    my_list
    # $`a`
    # [1] 3
    
    # $b
    # [1] 3
    
    # $c
    # [1] 4
    
    # $d
    # [1] "Hello"
    
    # $e
    # [1] NA
    

    Remove single element from list

     my_list[-3]
     # $`a`
     # [1] 3
    
     # $b
     # [1] 3
    
     # $d
     # [1] "Hello"
    
     # $e
     [1] NA
    

    Remove multiple elements from list

     my_list[c(-1,-3,-2)]
     # $`d`
     # [1] "Hello"
    
     # $e
     # [1] NA
    

     my_list[c(-3:-5)]
     # $`a`
     # [1] 3
    
     # $b
     # [1] 3
    

     my_list[-seq(1:2)]
     # $`c`
     # [1] 4
    
     # $d
     # [1] "Hello"
    
     # $e
     # [1] NA
    
    0 讨论(0)
  • 2020-11-28 01:50

    You can also negatively index from a list using the extract function of the magrittr package to remove a list item.

    a <- seq(1,5)
    b <- seq(2,6)
    c <- seq(3,7)
    l <- list(a,b,c)
    
    library(magrittr)
    
    extract(l,-1) #simple one-function method
    [[1]]
    [1] 2 3 4 5 6
    
    [[2]]
    [1] 3 4 5 6 7
    
    0 讨论(0)
提交回复
热议问题