【问题标题】:How to expand a list with NULLs up to some length?如何将具有 NULL 的列表扩展到一定长度?
【发布时间】:2011-11-11 17:57:32
【问题描述】:

给定一个长度为<= N 的列表,用尾随NULLs 填充它的最佳/最有效方法是什么(使其长度为N)。

这在任何体面的语言中都是单行的,但我不知道如何在 R 中的几行中(有效地)做到这一点,以便它适用于每个角落情况(零长度列表等等)。

【问题讨论】:

    标签: list r null resize fill


    【解决方案1】:

    让我们保持简单:

    tst<-1:10 #whatever, to get a vector of length 10
    tst<-tst[1:15]
    

    【讨论】:

    • 就是这样。此解决方案比 Matthew Dowle 提出的解决方案快 2 倍,比我笨拙的解决方案快约 5 倍。
    • @leden。还有一种方法就是length(tst)=15。有更快的吗?你是怎么测试的?
    • 是的,这对于大型列表来说甚至更快。谢谢。
    • @RomanLuštrik:咳咳。幸运的是,它也适用于tst&lt;-list(1,2,3)。但当然,列表只是向量的一个特例,所以我想我会提供更通用的解决方案。
    【解决方案2】:

    试试这个:

    > l = list("a",1:3)
    > N = 5
    > l[N+1]=NULL
    > l
    [[1]]
    [1] "a"
    
    [[2]]
    [1] 1 2 3
    
    [[3]]
    NULL
    
    [[4]]
    NULL
    
    [[5]]
    NULL
    
    >
    

    【讨论】:

      【解决方案3】:

      这个怎么样?

      > l = list("a",1:3)
      > length(l)=5
      > l
      [[1]]
      [1] "a"
      
      [[2]]
      [1] 1 2 3
      
      [[3]]
      NULL
      
      [[4]]
      NULL
      
      [[5]]
      NULL
      

      【讨论】:

        【解决方案4】:

        据我所知,直接编辑列表的长度似乎是最快的:

        tmp <- vector("list",5000)
        sol1 <- function(x){
            x <- x[1:10000] 
        }
        sol2 <- function(x){
            x[10001] <- NULL
        }
        sol3 <- function(x){
            length(x) <- 10000
        }
        
        library(rbenchmark)
        benchmark(sol1(tmp),sol2(tmp),sol3(tmp),replications = 5000)
               test replications elapsed relative user.self sys.self user.child sys.child
        1 sol1(tmp)         5000   2.045 1.394952     1.327    0.727          0         0
        2 sol2(tmp)         5000   2.849 1.943383     1.804    1.075          0         0
        3 sol3(tmp)         5000   1.466 1.000000     0.937    0.548          0         0
        

        但我想,除非你在很长的列表中经常这样做,否则差异并不大。

        【讨论】:

          【解决方案5】:

          我确信有更短的方法,但我倾向于这样做:

          l <- as.list(1:10)
          N <- 15
          l <- c(l, as.list(rep(NA, N - length(l) )))
          

          【讨论】:

            【解决方案6】:

            您好:我不确定您是否在谈论实际列表,但如果您是,以下将起作用。它之所以有效,是因为一旦您访问不存在的向量(即列表是)的元素,R 会将向量扩展至该长度。

            length <- 10
            temp <- list("a","b")
            print(temp)
            temp[length] <- NULL
            print(temp)
            

            【讨论】:

              猜你喜欢
              • 2019-08-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-03-02
              相关资源
              最近更新 更多