我有一个 Dataframe ,其中有一个冒号的此类值
test1=data.frame(c("ABC 01; 02; 03", "test2 01; 02; 03"))
我想在分号前插入文本,如下所示:
test1=data.frame(c("ABC 01; ABC 02; ABC 03", "test2 01; test2 02; test2 03"))
谁能教我怎么做这个?2谢谢!3!
ghg1uchk1#
仅使用碱基R:
test1$y <- mapply( \(org, key) gsub("; ([0-9]+)", key, org), org = test1$x, key = sprintf("; %s \\1", sub(" .+", "", test1$x)) ) x y 1 ABC 01; 02; 03 ABC 01; ABC 02; ABC 03 2 test2 01; 02; 03 test2 01; test2 02; test2 03
数据类型
test1 <- data.frame(x = c("ABC 01; 02; 03", "test2 01; 02; 03"))
xj3cbfub2#
下面是一个两步tidyverse解决方案:
tidyverse
library(tidyverse) test1 %>% mutate( # create temporary variable containing text string: temp = str_replace(var, "(\\w+).*", " \\1"), # add text string each time there is ";" to the left: var= str_replace_all(var, "(?<=;)", temp)) %>% # remove `temp`: select(-temp) var 1 ABC 01; ABC 02; ABC 03 2 test2 01; test2 02; test2 03
工作原理:
str_replace
\\w+
\\1
str_replace_all
temp
var
;
(?<= ...)
test1=data.frame(var = c("ABC 01; 02; 03", "test2 01; 02; 03"))
vmpqdwk33#
另一个正则表达式选项可以是在捕获组中解析所有内容:
fun <- \(x) gsub("(\\w+) (\\d+); (\\d+); (\\d+)", "\\1 \\2; \\1 \\3; \\1 \\4", x)
然后使用dplyr或base:x一个一个一个一个x一个一个二个x输出:
dplyr
base
string result 1 ABC 01; 02; 03 ABC 01; ABC 02; ABC 03 2 test2 01; 02; 03 test2 01; test2 02; test2 03
数据:
test1 <- data.frame(string = c("ABC 01; 02; 03", "test2 01; 02; 03"))
x6yk4ghg4#
使用 strsplit 和 paste。按空格拆分,然后将第一项粘贴到除第一项以外的所有项:
test1$new <- sapply(strsplit(test1$x, " ", fixed = TRUE), function(i) paste(paste(i[ 1 ], i[ -1 ]), collapse = " ")) test1 # x new # 1 ABC 01; 02; 03 ABC 01; ABC 02; ABC 03 # 2 test2 01; 02; 03 test2 01; test2 02; test2 03
zaqlnxep5#
下面是使用stringr函数的选项。
stringr
library(dplyr) library(stringr) test1 = data.frame(col = c("ABC 01; 02; 03", "test2 01; 02; 03")) result <- test1 %>% mutate(common = str_extract(col, '\\w+'), parts = str_split(str_remove(col, common), ';\\s+'), new_string = purrr::map2_chr(common, parts, str_c, sep = " ", collapse = ";")) result # col common parts new_string #1 ABC 01; 02; 03 ABC 01, 02, 03 ABC 01;ABC 02;ABC 03 #2 test2 01; 02; 03 test2 01, 02, 03 test2 01;test2 02;test2 03 result$new_string #[1] "ABC 01;ABC 02;ABC 03" "test2 01;test2 02;test2 03"
您可以从result中删除不需要的列。
result
5条答案
按热度按时间ghg1uchk1#
仅使用碱基R:
数据类型
xj3cbfub2#
下面是一个两步
tidyverse
解决方案:工作原理:
str_replace
,我们将字符串首字母数字子串(\\w+
)定义为捕获组(通过将其放入括号中),并使用反向引用(\\1
)在替换子句中引用它,并且单独引用它,其中我们还添加一个空格(在反向引用之前)str_replace_all
,我们将temp
中的文本字符串添加到var
中的字符串,条件是紧挨着左边存在文字;
(这种类型的 * 条件 * 匹配被称为正向后看;其语法为(?<= ...)
)数据:
vmpqdwk33#
另一个正则表达式选项可以是在捕获组中解析所有内容:
然后使用
dplyr
或base
:x一个一个一个一个x一个一个二个x
输出:
数据:
x6yk4ghg4#
使用 strsplit 和 paste。按空格拆分,然后将第一项粘贴到除第一项以外的所有项:
zaqlnxep5#
下面是使用
stringr
函数的选项。您可以从
result
中删除不需要的列。