首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R基管进入`do.call`

R基管进入`do.call`
EN

Stack Overflow用户
提问于 2021-06-26 13:50:08
回答 1查看 240关注 0票数 0

假设我有一个list (myList),它由一些data.frame对象组成,我希望使用一个do.call方法中的rbind将列表中的所有元素折叠到一个data.frame结构中:

代码语言:javascript
复制
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表达式(由.表示)。

代码语言:javascript
复制
myList %>% do.call("rbind", .)

但是,使用新的基本管道(|>)会导致执行相同操作的错误:

代码语言:javascript
复制
myList |> do.call("rbind", .)
代码语言:javascript
复制
#> Error in do.call(myList, "rbind", .) : 
#>  second argument must be a list

在lhs表达式不一定是方法的第一个参数的情况下,如何正确地将这个(和其他类似的操作)连接到R的新的基本管道操作符中?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-26 13:53:35

1)命名参数 |>总是插入第一个参数,不支持点,但这样做是可行的:

代码语言:javascript
复制
myList |> do.call(what = "rbind")

2)匿名函数调用--尽管有点冗长--这也有效:

代码语言:javascript
复制
myList |> (\(args) do.call("rbind", args))()

( 2a)命名函数或定义类似于Do.call的do.call,但前两个参数交换如下:

代码语言:javascript
复制
Do.call <- \(args, what, ...) do.call(what, args, ...)
myList |> Do.call("rbind")

2b)或定义接受第二个参数、函数以及第一个和其余参数的函数。

代码语言:javascript
复制
Swap <- \(x, fun, y, ...) fun(y, x, ...)
myList |> Swap(do.call, "rbind")

3) myList结构已知的如果您知道myList恰好有两个组件,并且它们被命名为a和b,那么这也可以:

代码语言:javascript
复制
myList |> with(rbind(a, b))

4)管道替代品当然没有什么可以阻止继续使用magrittr管道的。此外,异形管并不是真正的管道,它看起来像管道,只需要基本R就可以使用:

代码语言:javascript
复制
myList ->.;
  do.call("rbind", .)

5) 代替使用rbind使用dplyr的bind_rows或data.table的rbindlist:

代码语言:javascript
复制
library(dplyr)
myList |> bind_rows()

library(data.table)
myList |> rbindlist()

6) do.call Alternative使用减自purrr代替do.call,至少在本例中是这样的。

代码语言:javascript
复制
library(purrr)
myList |> reduce(rbind)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68142977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档