R unlist changes names

后端 未结 2 756
余生分开走
余生分开走 2020-12-19 02:54

Given the following list:

l <- list(\"foo123\"=c(1:3), \"foo456\"=5, \"foo789\"=8)
print(l)
#  $foo123
#  [1] 1 2 3
#  
#  $foo456
#  [1] 5
#  
#  $foo789         


        
相关标签:
2条回答
  • 2020-12-19 03:17

    We can try setting the names after unlisting. We also use use.names=FALSE to avoid creating and rewriting a vector of names (MartinMorgan):

    setNames(unlist(l, use.names=F),rep(names(l), lengths(l)))
    #foo123 foo123 foo123 foo456 foo789 
    #     1      2      3      5      8
    

    However, note that in most cases, duplicate names will lead to ambiguity and possibly errors. Given your example, if we now attempt to subset using the name "foo123" R outputs only the first instance:

    o <- setNames(unlist(l, use.names=F),rep(names(l), lengths(l)))
    o["foo123"]
    #  foo123
    #       1
    
    0 讨论(0)
  • 2020-12-19 03:34

    This doesn't exactly answer your question, but an alternative that you can consider would be to go from a list to a "long" data.frame or data.table.

    This is easily achieved with stack in base R or melt from "reshape2" or "data.table".

    Example:

    stack(l)
    #   values    ind
    # 1      1 foo123
    # 2      2 foo123
    # 3      3 foo123
    # 4      5 foo456
    # 5      8 foo789
    
    library(data.table)
    melt(l)
    #   value     L1
    # 1     1 foo123
    # 2     2 foo123
    # 3     3 foo123
    # 4     5 foo456
    # 5     8 foo789
    

    Then, if you really wanted a named vector, you could always do:

    o <- data.table::melt(l)
    setNames(o$value, o$L1)
    # foo123 foo123 foo123 foo456 foo789 
    #      1      2      3      5      8 
    
    0 讨论(0)
提交回复
热议问题