R dplyr 使用自定义函数改变多列以创建新列

标签 r dataframe dplyr

我想使用自定义函数在 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 解决方案感兴趣。感谢您的帮助。

最佳答案

我们可以使用maplift_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/

相关文章:

python-3.x - 在没有要聚合的数字列的情况下透视两列 DataFrame

r - dplyr 不按日期对数据进行分组

regex - 删除最后一次出现的字符

r - 如何使用 str_extract() 从包 stringr 中提取括号内但不包括括号的数字?

r - 为 CV 结果的 e1071 中的 svm 生成混淆矩阵

r - 如何使用RMixpanel库导出csv中的数据

c++ - 如何在 R 对象中存储 CPP 类?

python - 在 y 轴上绘制特定值而不是增加数据帧的比例

r - 如何避免 ggplot2 条形图中条形之间的间距不均匀?

r - R 计算函数参数方式的魔力