假设我有一个list (myList),它由一些data.frame对象组成,我希望使用一个do.call方法中的rbind将列表中的所有元素折叠到一个data.frame结构中:
set.seed(123)
myList <- list(
a = data.frame(
h1 = rnorm(5),
h2 = rnorm(5)
),
b = data.frame(
h1 = rnorm(5),
h2 = rnorm(5)
)
)使用magrittr的管道操作符(%>%),您可以这样做,其中do.call (args)中的第二个参数是lhs表达式(由.表示)。
myList %>% do.call("rbind", .)但是,使用新的基本管道(|>)会导致执行相同操作的错误:
myList |> do.call("rbind", .)#> Error in do.call(myList, "rbind", .) :
#> second argument must be a list在lhs表达式不一定是方法的第一个参数的情况下,如何正确地将这个(和其他类似的操作)连接到R的新的基本管道操作符中?
发布于 2021-06-26 13:53:35
1)命名参数 |>总是插入第一个参数,不支持点,但这样做是可行的:
myList |> do.call(what = "rbind")2)匿名函数调用--尽管有点冗长--这也有效:
myList |> (\(args) do.call("rbind", args))()( 2a)命名函数或定义类似于Do.call的do.call,但前两个参数交换如下:
Do.call <- \(args, what, ...) do.call(what, args, ...)
myList |> Do.call("rbind")2b)或定义接受第二个参数、函数以及第一个和其余参数的函数。
Swap <- \(x, fun, y, ...) fun(y, x, ...)
myList |> Swap(do.call, "rbind")3) myList结构已知的如果您知道myList恰好有两个组件,并且它们被命名为a和b,那么这也可以:
myList |> with(rbind(a, b))4)管道替代品当然没有什么可以阻止继续使用magrittr管道的。此外,异形管并不是真正的管道,它看起来像管道,只需要基本R就可以使用:
myList ->.;
do.call("rbind", .)5) 代替使用rbind使用dplyr的bind_rows或data.table的rbindlist:
library(dplyr)
myList |> bind_rows()
library(data.table)
myList |> rbindlist()6) do.call Alternative使用减自purrr代替do.call,至少在本例中是这样的。
library(purrr)
myList |> reduce(rbind)https://stackoverflow.com/questions/68142977
复制相似问题