我有一个像这样的数据框:
x <- data.frame(filename = c("aa-b-c x", "c-dd-e y"), number=c(1,2))
filename number
1 aa-b-c x 1
2 c-dd-e y 2
我想更改文件名列,使其看起来像这样:
filename number
1 c/aa/b 1
2 e/dd/c 2
这适用于单行:paste(str_match(x$filename[1], "(\\w+)-(\\w+)-(\\w+)")[c(4,2,3)], collapse = "/")
,但在mutate
内部失败。我确定我缺少一个简单的修复程序。
答案 0 :(得分:2)
一种选择是在成组捕获后重新排列组件
library(dplyr)
library(stringr)
x %>%
mutate(filname = str_replace(filename,
"^([a-z]+)-([a-z]+)-([a-z]+)\\s.*", "\\3/\\1/\\2"))
答案 1 :(得分:2)
str_match
为矩阵提供多个矢量时将返回一个矩阵。这应该可以很好地工作:
apply(str_match(x$filename, "(\\w+)-(\\w+)-(\\w+)")[, c(4,2,3), drop = FALSE], 1, paste, collapse = "/")
# [1] "c/aa/b" "e/c/dd"
在只有一行的情况下,drop = FALSE
对于保持输出矩阵是必要的。