考虑这段代码:
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))
但是上面的
:=
语法不起作用。
一种选择是添加一个可选参数来命名输出和/或根据输入列的名称设置输出的名称,例如像这样的东西:
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