[英]Combine two data frames into one using values from each that are less than one, and apply to a list of data frames
[英]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.