How can I remove an element from a list?

前端 未结 16 1385
傲寒
傲寒 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:31

    If you don't want to modify the list in-place (e.g. for passing the list with an element removed to a function), you can use indexing: negative indices mean "don't include this element".

    x <- list("a", "b", "c", "d", "e"); # example list
    
    x[-2];       # without 2nd element
    
    x[-c(2, 3)]; # without 2nd and 3rd
    

    Also, logical index vectors are useful:

    x[x != "b"]; # without elements that are "b"
    

    This works with dataframes, too:

    df <- data.frame(number = 1:5, name = letters[1:5])
    
    df[df$name != "b", ];     # rows without "b"
    
    df[df$number %% 2 == 1, ] # rows with odd numbers only
    
    0 讨论(0)
  • 2020-11-28 01:31

    How about this? Again, using indices

    > m <- c(1:5)
    > m
    [1] 1 2 3 4 5
    
    > m[1:length(m)-1]
    [1] 1 2 3 4
    

    or

    > m[-(length(m))]
    [1] 1 2 3 4
    
    0 讨论(0)
  • 2020-11-28 01:33

    Removing Null elements from a list in single line :

    x=x[-(which(sapply(x,is.null),arr.ind=TRUE))]

    Cheers

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

    Don't know if you still need an answer to this but I found from my limited (3 weeks worth of self-teaching R) experience with R that, using the NULL assignment is actually wrong or sub-optimal especially if you're dynamically updating a list in something like a for-loop.

    To be more precise, using

    myList[[5]] <- NULL
    

    will throw the error

    myList[[5]] <- NULL : replacement has length zero

    or

    more elements supplied than there are to replace

    What I found to work more consistently is

    myList <- myList[[-5]]
    
    0 讨论(0)
  • 2020-11-28 01:36

    Here is how the remove the last element of a list in R:

    x <- list("a", "b", "c", "d", "e")
    x[length(x)] <- NULL
    

    If x might be a vector then you would need to create a new object:

    x <- c("a", "b", "c", "d", "e")
    x <- x[-length(x)]
    
    • Work for lists and vectors
    0 讨论(0)
  • 2020-11-28 01:36

    I would like to add that if it's a named list you can simply use within.

    l <- list(a = 1, b = 2)    
    > within(l, rm(a))
    $b
    [1] 2
    

    So you can overwrite the original list

    l <- within(l, rm(a)) 
    

    to remove element named a from list l.

    0 讨论(0)
提交回复
热议问题