如何从“mutate”内的一个函数返回多列并允许我命名输出列?

问题描述 投票:0回答:1

考虑这段代码:

library(dplyr)
a = data.frame(a = 1:3)
abc = \(x) data.frame(x/2, x/3)
a %>% 
  mutate(abc(a))

返回

  a x.2       x.3
1 1 0.5 0.3333333
2 2 1.0 0.6666667
3 3 1.5 1.0000000

但我无法控制这些名称,因为我想为它们指定其他名称。

解决此问题的一种方法是命名

abc
的返回类型,但这并不理想,因为我可能想在两组变量上运行
abc

a %>% 
  mutate(abc(a), abc(b))

另一种方法当然是在每次运行

rename
后对它们进行
abc
但这样可能会不稳定。

有没有办法为

abc
的输出命名?例如

a %>% 
  mutate(c("a1","a2") := abc(a), c("b1","b2") := abc(b))

但是上面的

:=
语法不起作用。

r dplyr
1个回答
0
投票

一种选择是添加一个可选参数来命名输出和/或根据输入列的名称设置输出的名称,例如像这样的东西:

library(dplyr, warn = FALSE)

a <- data.frame(a = 1:3, b = 4:6)

abc <- \(x, .names = NULL) {
  if (is.null(.names)) .names <- paste0(deparse(substitute(x)), 1:2)
  setNames(data.frame(x / 2, x / 3), .names)
}

a %>%
  mutate(abc(a))
#>   a b  a1        a2
#> 1 1 4 0.5 0.3333333
#> 2 2 5 1.0 0.6666667
#> 3 3 6 1.5 1.0000000

a %>%
  mutate(abc(a, c("ab", "ba")))
#>   a b  ab        ba
#> 1 1 4 0.5 0.3333333
#> 2 2 5 1.0 0.6666667
#> 3 3 6 1.5 1.0000000

a %>%
  mutate(abc(a), abc(b))
#>   a b  a1        a2  b1       b2
#> 1 1 4 0.5 0.3333333 2.0 1.333333
#> 2 2 5 1.0 0.6666667 2.5 1.666667
#> 3 3 6 1.5 1.0000000 3.0 2.000000
© www.soinside.com 2019 - 2024. All rights reserved.