我想使用自定义函数在 data.frame 中使用 dplyr::mutate
创建新列,该函数的参数是 data.frame 列名称的向量,但我得到以下输出:
customFun <- function(col.vec) {
paste0(gsub("\\s", "_", col.vec), collapse = "-")
}
df <- data.frame(A = c("x 1", "x", "x w"), B = c("E", "D", "2 w"), stringsAsFactors = FALSE)
df %>%
mutate(C = customFun(c(A, B)))
A B C
1 x 1 E x_1-x-x_w-E-D-2_w
2 x D x_1-x-x_w-E-D-2_w
3 x w 2 w x_1-x-x_w-E-D-2_w
代替:
data.table::data.table(df)[, C := customFun(c(A, B)), by = .(A, B)]
A B C
1: x 1 E x_1-E
2: x D x-D
3: x w 2 w x_w-2_w
它可以通过多种方式实现,但我只对 dplyr
解决方案感兴趣。感谢您的帮助。
最佳答案
我们可以使用map
和lift_dl
。我们首先对每个 col.vec
进行 map
(注意我使用列表而不是向量作为输入,因为 c
会展平任何向量元素,而列表没有)并应用 gsub
。然后列表输出被送入paste
。由于 paste
采用 ...
,我们可以使用 purrr::lift_dl
从 ...
提升它的输入域> 到 list
类型:
library(dplyr)
library(purrr)
customFun <- function(col.vec) {
map(col.vec, ~gsub("\\s", "_", .x)) %>%
lift_dl(paste, sep = "-")()
}
df %>%
mutate(C = customFun(list(A, B)))
或者以 ...
作为输入:
customFun <- function(...) {
col.vec <- list(...)
map(col.vec, ~gsub("\\s", "_", .x)) %>%
lift_dl(paste, sep = "-")()
}
df %>%
mutate(C = customFun(A, B))
输出:
A B C
1 x 1 E x_1-E
2 x D x-D
3 x w 2 w x_w-2_w
关于R dplyr 使用自定义函数改变多列以创建新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54540943/