【发布时间】:2019-02-05 18:36:46
【问题描述】:
我想使用 dplyr::mutate 使用自定义函数在 data.frame 中创建新列,该函数的参数是 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 解决方案感兴趣。感谢您的帮助。
【问题讨论】:
-
Mutate 只能返回一个与数据长度相同或长度为 1 的向量。到目前为止,您的自定义函数还没有做到这一点。我猜你没有做你期望做的事情,例如,你到底在粘贴什么?你有一个长向量,你用 sep 粘贴什么?试试
with(head(iris),customFun(c(Species, Petal.Length, Petal.Width))),你会发现这不是你想要的。c(Species, Petal.Length, Petal.Width)已经是一个向量,所以技术上不能粘贴到另一个不存在的东西上 -
对不起,伙计们,我提供了不好的例子 - 我更新了我的问题,现在可以了。
-
即使使用data.tables,如果你有两个相似的行,你会被折叠成一个。你的 customFunc 不对
-
你需要做类似
df%>%mutate(C = invoke(paste,data.frame(gsub('\\s+','_',as.matrix(.))),sep='-'))的事情