【问题标题】:Make List easier with For-Loop使用 For-Loop 使 List 更容易
【发布时间】:2017-07-23 04:18:20
【问题描述】:
library(xml2)
library(rvest)

datpackage <- paste0("dat",1:10)

for(i in 1:10){

  assign(datpackage[i], runif(2))

}

datlist <- list(dat1, dat2, dat3, dat4, dat5, dat6, dat7, dat8, dat9, dat10)

“datlist”是我想要的,但有没有更简单的方法来制作列表?

datlist2 <- for (i in 1:10) {
                list(paste0("dat",i))
}

datlist3 <- list(datpackage)
我尝试过 datlist2 和 datlist3,但这与“datlist”不同。

当我制作包含数千条数据的列表时,我应该怎么做?

【问题讨论】:

  • datlist &lt;- lapply(1:10, function(ign) runif(2))?如果需要,您可以在之后指定名称。
  • @akrun 使用replicate 的代码更具可读性,这通常是一件好事。如果这是一个简化的示例并且您需要为 10 个“事物”中的每一个做更多的事情,那么使用 lapply 会更合适。 (而且由于replicate 只是简单地调用sapply,它的性能相似。它的使用主要取决于个人喜好。)

标签: r list for-loop


【解决方案1】:

如果对象已经创建,我们可以使用pastemget

datlist <- mget(paste0("dat", 1:10))

但是,如果我们需要创建一个随机统一数列表,

datlist <- replicate(10, runif(2), simplify = FALSE)

【讨论】:

    【解决方案2】:

    对于创建带有随机数的列表,我还建议:

    datlist2 <- lapply(vector("list", 10), function(x) {runif(2)})
    

    基准测试

    可能值得补充的是,lapply / vector 方法似乎更快:

    funA <- function(x) {replicate(10, runif(2), simplify = FALSE)}
    funB <- function(x) {lapply(vector("list", 10), function(x) {runif(2)})}
    microbenchmark::microbenchmark(funA(), funB(), times = 1e4)
    

    结果

    Unit: microseconds
       expr    min      lq     mean  median      uq      max neval cld
     funA() 24.053 27.3305 37.98530 28.6665 34.4045 2478.510 10000   b
     funB() 19.507 21.6400 30.37437 22.9235 27.0500 2547.145 10000  a 
    

    【讨论】:

      猜你喜欢
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-01
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 2022-06-17
      相关资源
      最近更新 更多