簡體   English   中英

如何有效地將超過 2 個數據幀列表附加/組合到一個列表中?

[英]How to append/combine more than 2 lists of data frames into one list efficiently?

我有要合並為一個的數據框列表。 例如:

ls1 <- list(data.frame(A = rnorm(3), B = rnorm(3)), data.frame(A = rnorm(3), B = rnorm(3)))
ls2 <- list(data.frame(A = rnorm(3), B = rnorm(3)), data.frame(A = rnorm(3), B = rnorm(3)))
ls3 <- list(data.frame(A = rnorm(3), B = rnorm(3)), data.frame(A = rnorm(3), B = rnorm(3)))

我使用mapply在 stackoverflow 上找到了這個答案 我認為這不適用於我的情況。

res1 <- mapply(c, ls1, ls2, ls3, SIMPLIFY = F)
res1 |> View()

在此處輸入圖像描述

它創建一個長度為 2 的列表和長度為 6 的子列表。我想要的 output 是這樣的:

res2 <- append(ls1, ls2)
res2 <- append(res2, ls3)
res2 |> View()

在此處輸入圖像描述

我有 10 多個要合並為一個的數據框列表。 除了使用append ,有沒有更有效的方法將它們全部組合在一個列表中?

一種選擇可能是:

Reduce(c, mget(ls(pattern = "ls")))

與原始結果相比:

setequal(Reduce(c, mget(ls(pattern = "ls"))), res2)

[1] TRUE

unlist會比Reduce快一點。

n <- 3L
for (i in 1:1e3) assign(paste0("ls", i), list(data.frame(A = rnorm(n), B = rnorm(n)), data.frame(A = rnorm(n), B = rnorm(n))))

f1 <- function(envir = .GlobalEnv) unlist(mget(ls(pattern = "ls", envir = envir), envir), FALSE, FALSE)
f2 <- function(envir = .GlobalEnv) Reduce(c, mget(ls(pattern = "ls", envir = envir), envir))

microbenchmark::microbenchmark(f1 = f1(),
                               f2 = f2(),
                               check = "identical")
#> Unit: milliseconds
#>  expr    min      lq     mean  median      uq     max neval
#>    f1 1.8792 1.91630 1.971708 1.93410 1.98085  3.7408   100
#>    f2 6.3691 6.47915 7.100086 6.59355 6.96825 15.7032   100

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM