如何使用purrr::pmap从数据框中设置函数参数,而无需编写所有列名称?

3

我有这个数据框和函数。

df <- tibble(
  a = "a",
  b = "b",
  c = "c",
  d = "d",
  e = "e",
  f = "f",
  g = "g"
)

pmap(df, function(a, b, c, d, e, f, g) {
    
    var_1 <- paste0(a, b)

    var_2 <- c + d + e

    var_3 <- f/g

   tibble(
   a = var_1
   b = var_2
   c = var_3
)
    
  })

该函数按预期工作。由于列名可能超过七个,我不想在function()内编写所有列名。有什么办法吗?

所需类似代码:

pmap(df, function(names(df)) {
  
    var_1 <- paste0(a, b)

    var_2 <- c + d + e

    var_3 <- f/g

   tibble(
   a = var_1
   b = var_2
   c = var_3
)
  
})


purrr::pmap(df, paste0)?Base R:do.call(paste0, df) - Rui Barradas
paste0只是一个例子,实际情况更为复杂。我确实需要在function()内部获取列名。 - Alvaro Morales
您可以将其与任何选择助手结合使用,例如 pmap(select(df, a:g), paste0) - tmfmnk
如果我真正使用paste0,那就可以运行,但这并不是真实情况。请参见上文。 - Alvaro Morales
2个回答

4

使用 ...list2envrlang::current_env,您可以执行以下操作:

注意:我略微更改了您的示例数据,使c到g是数值型。

library(purrr)
library(tibble)
library(rlang)

df <- tibble(
  a = "a",
  b = "b",
  c = 1,
  d = 2,
  e = 3,
  f = 4,
  g = 5
)

pmap(df, function(...) {
  list2env(list(...), envir = rlang::current_env())
  
  var_1 <- paste0(a, b)
  
  var_2 <- c + d + e
  
  var_3 <- f/g
  
  tibble(
    a = var_1,
    b = var_2,
    c = var_3
  )
})
#> [[1]]
#> # A tibble: 1 × 3
#>   a         b     c
#>   <chr> <dbl> <dbl>
#> 1 ab        6   0.8

3
在这种情况下,我更喜欢使用with(list(...), #这里是代码块)
在stefan的解决方案基础上进行改进:
pmap(df,~with(list(...),{var_1 <- paste0(a, b);
                        var_2 <- c + d + e;
                        var_3 <- f/g;
                        tibble(a = var_1, b = var_2, c = var_3)}))
#[[1]]
## A tibble: 1 × 3
#  a         b     c
#  <chr> <dbl> <dbl>
#1 ab        6   0.8

你在 mutate 上下文中会做什么?如果你想要在新列中创建 pmap 输出,该怎么做? - Alvaro Morales
1
在变异上下文中,您不会遇到这个问题,因为变量已经可以通过它们的符号访问。如果您的操作无法进行矢量化,您始终可以使用 rowwise() - Ian Campbell
是的,但问题是,您不想再次编写列名。像这样(至少这是我知道的方法)。 df%>% mutate(union = pmap(list(a,b,c,d,e,f,g),function(a,b,c,d,e,f,g){#stuff} - Alvaro Morales
1
你可以使用 df %>% mutate(union = pmap(dplyr::cur_data(), ~ with(list(...), #stuff)) - Ian Campbell
嗨,@Ian Campbell,再次打扰真不好意思。你知道在一个~with (list(...), X)的内部,X是函数的主体,在X中如何不显式地获取变量的方法吗?通常我会这样做:any(e > c, e > d, e > f, e > g)来得到TRUE,但如果变量很多,那么写出所有的变量会很繁琐,就像这样any(e > c, e > d, e > f, e > g, e > h, e > i, e > j, e > k, e > l, 等等) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接