【问题标题】:Using purrr::pmap() in a rowwise manner outside of mutate()在 mutate() 之外以逐行方式使用 purrr::pmap()
【发布时间】:2018-11-20 23:27:34
【问题描述】:

我正在尝试使用 purrr::pmap() 沿某些数据帧行以逐行方式应用自定义函数。我可以使用 for 循环和 apply() 实现我想要的最终结果,但是当我尝试使用 pmap() 时,我只能结合 mutate() 获得我想要的结果,这在我的实际应用案例中会不够。

有没有办法使用pmap() 来应用我的自定义函数并且只打印输出而不是存储在新列中?

library(dplyr)
library(purrr)
library(tibble)

创建演示数据和自定义函数

set.seed(57)

ds_mt <- 
  mtcars %>% 
    rownames_to_column("model") %>% 
    mutate(
      am = factor(am, labels = c("auto", "manual")), 
      vs = factor(vs, labels = c("V", "S"))
    ) %>% 
  select(model, mpg, wt, cyl, am, vs) %>% 
  sample_n(3)

foo <- function(model, am, mpg){
  print(
    paste("The", model, "has a", am, "transmission and gets", mpg, "mpgs.")
  )
}

逐行for循环的成功例子:

for (row in 1:nrow(ds_mt)) {
  foo(
    model = ds_mt[row, "model"], 
    am    = ds_mt[row, "am"],
    mpg   = ds_mt[row, "mpg"]
  )
}

使用apply()的成功示例:

row.names(ds_mt) <- NULL # to avoid named vector as output

  apply(
    ds_mt, 
    MARGIN = 1, 
    FUN = function(ds) 
      foo(
        model = ds["model"],
        am = ds["am"],
        mpg = ds["mpg"]
      )
  ) 

mutate() 中使用pmap() 的示例几乎就是我需要的。

ds_mt %>% 
  mutate(new_var = 
    pmap(
      .l = 
        list(
          model = model,
          am = am,
          mpg = mpg
        ),
      .f = foo
    ))

失败代码:为什么这不起作用?

ds_mt %>% 
  pmap(
    .l = 
      list(
        model = model,
        am = am,
        mpg = mpg
      ),
    .f = foo
  )

【问题讨论】:

  • 请注意paste 是矢量化的,因此不需要各种逐行操作。 with(mtcars[1:3, ], paste("The", vs, "has a", am, "transmission and gets", mpg, "mpgs."))。也许这是一个玩具示例,您有一个未矢量化的“真实”函数?
  • 您正在将ds_mt 传递给当前代码中pmap() 中的任何参数。您可以选择所需的列,然后将该对象传递给.l。就像ds_mt %&gt;% select(model, am, mpg) %&gt;% pmap(foo) 一样(尽管其他人已经指出你不需要这个来完成这个特定的任务。)

标签: r purrr pmap


【解决方案1】:

所以经过更多阅读后,这似乎是 pwalk() 而不是 pmap() 的情况,因为我试图让输出打印(即副作用)而不是存储在数据帧中。

library(dplyr)
library(purrr)
library(tibble)

set.seed(57)

ds_mt <- 
  mtcars %>% 
  rownames_to_column("model") %>% 
  mutate(
    am = factor(am, labels = c("auto", "manual")), 
    vs = factor(vs, labels = c("V", "S"))
  ) %>% 
  select(model, mpg, wt, cyl, am, vs) %>% 
  sample_n(3)

foo <- function(model, am, mpg){
  print(
    paste("The", model, "has a", am, "transmission and gets", mpg, "mpgs.")
  )
}

ds_mt %>% 
  select(model, am, mpg) %>% 
  pwalk(
  .l = .,
  .f = foo
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 2018-03-09
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    相关资源
    最近更新 更多