【问题标题】:Define names of objects in multiple lists within a list (using lapply?)在列表中的多个列表中定义对象的名称(使用 lapply?)
【发布时间】:2013-09-13 14:18:22
【问题描述】:

对于这个有点混乱的标题,我深表歉意(欢迎任何改进建议)..

假设我有一个列表,其中包含多个(例如四个)列表,稍后我想在其中存储 20 个对象:

mylist <- vector(mode="list",length=4)
names(mylist) <- c("One","Two","Three","Four")
mylist$One <- mylist$Two <- mylist$Three <- mylist$Four <- vector(mode="list",
                                                                  length=20)

我想预先定义这些对象的名称。当然,我可以这样做:

 names(mylist$One) <- c("A","B","C","D","E","F","G","H","I","J",
                        "K","L","M","N","O","P","Q","R","S","T")

 names(mylist$Two) <- names(mylist$Three) <- names(mylist$Four) <- names(mylist$One) 

但是如果列表的数量会增加(就像我的实际数据中的情况一样),这会变得相当麻烦,所以我尝试使用 lapply 之类的函数来做到这一点:

mylist <- lapply(mylist,FUN=function(x) {names(x) <-   
                        c("A","B","C","D","E","F","G","H","I","J",
                          "K","L","M","N","O","P","Q","R","S","T")})

然而,这并没有给我相同的结果,但我似乎无法弄清楚我在这里忽略了什么。有什么建议么?

谢谢!

【问题讨论】:

    标签: r list names lapply


    【解决方案1】:

    您需要在lapply 调用中返回一个值:

    mylist <- lapply(mylist,FUN=function(x) {names(x) <-   
                        c("A","B","C","D","E","F","G","H","I","J",
                          "K","L","M","N","O","P","Q","R","S","T")
                        x ## <- note the x here; you could also use return(x)
    })
    
    mylist
    # $One
    #   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T 
    # "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" 
    # 
    # $Two
    #   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T 
    # "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" 
    # 
    # $Three
    #   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T 
    # "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" 
    # 
    # $Four
    #   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T 
    # "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" 
    

    【讨论】:

      【解决方案2】:

      这是我的实现,我认为它会产生您期望的结果

      mylist <- vector(mode="list",length=4)
      names(mylist) <- c("One","Two","Three","Four")
      mylist$One <- mylist$Two <- mylist$Three <- mylist$Four <- vector(mode="list",length=20)
      
      renameList <- function(mylist,k){
          names(mylist) <-  LETTERS[1:k]
          return(mylist)
      }
      
      mylist2 <- lapply(mylist, function(x) renameList(x,20))
      
      # > str(mylist2)
      # List of 4
      #  $ One  :List of 20
      #   ..$ A: NULL
      #   ..$ B: NULL
      #   ..$ C: NULL
      

      【讨论】:

      • 如果您要编写一个命名函数,您可能需要设置默认的k = length(mylist)
      猜你喜欢
      • 2013-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 2020-10-18
      • 1970-01-01
      • 1970-01-01
      • 2016-09-08
      相关资源
      最近更新 更多