在R中的分号后添加文本

g6ll5ycj  于 2022-12-20  发布在  其他
关注(0)|答案(5)|浏览(163)

我有一个 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!

ghg1uchk

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"))
xj3cbfub

xj3cbfub2#

下面是一个两步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

工作原理:

  1. 1.使用str_replace,我们将字符串首字母数字子串(\\w+)定义为捕获组(通过将其放入括号中),并使用反向引用(\\1)在替换子句中引用它,并且单独引用它,其中我们还添加一个空格(在反向引用之前)
  2. 1.接下来,使用str_replace_all,我们将temp中的文本字符串添加到var中的字符串,条件是紧挨着左边存在文字;(这种类型的 * 条件 * 匹配被称为正向后看;其语法为(?<= ...)
    数据:
test1=data.frame(var = c("ABC 01; 02; 03", "test2 01; 02; 03"))
vmpqdwk3

vmpqdwk33#

另一个正则表达式选项可以是在捕获组中解析所有内容:

fun <- \(x) gsub("(\\w+) (\\d+); (\\d+); (\\d+)", "\\1 \\2; \\1 \\3; \\1 \\4", x)

然后使用dplyrbase
x一个一个一个一个x一个一个二个x
输出:

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"))
x6yk4ghg

x6yk4ghg4#

使用 strsplitpaste。按空格拆分,然后将第一项粘贴到除第一项以外的所有项:

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
zaqlnxep

zaqlnxep5#

下面是使用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中删除不需要的列。

相关问题