从表中提取两个字符串之间的差异,并将其写入R中的新列中



我是编码新手,我正在尝试用R:解决这个问题

我得到了一张表的两列,它们都是长度不等的字符串。链的元素由一个符号分隔。现在,我想为每一行提取两个字符串链的差异,并将其写入一个新列。

结果
Stringchain 1 Stringchain 2
A00;B01;C02;D03 A00;B01;C02;D03;E04 E04
E04;F05;G06;H07 F05;G06;H07;I08 E04;I08

这里有一些类似于您使用tidyverse的方法。我创建了两个伪列vec_1vec_2,在其中我将字符串转换为矢量的列表列。诀窍是使用地图(或从底部开始(对每一行进行操作。

library(dplyr)
library(tokenizers)
library(purrr)
df %>% 
mutate(vec_1 = map(Stringchain_1, tokenize_regex, pattern = ";", simplify = TRUE),
vec_2 = map(Stringchain_2, tokenize_regex, pattern = ";", simplify = TRUE),
Result = map2_chr(vec_1, vec_2,
~ paste(c(setdiff(.x, .y), setdiff(.y, .x)),
collapse = ";")))

这就是结果。现在可以删除任何不需要的列。

# A tibble: 2 x 5
Stringchain_1   Stringchain_2       vec_1     vec_2     Result 
<chr>           <chr>               <list>    <list>    <chr>  
1 A00;B01;C02;D03 A00;B01;C02;D03;E04 <chr [4]> <chr [5]> E04    
2 E04;F05;G06;H07 F05;G06;H07;I08     <chr [4]> <chr [4]> E04;I08

我们可以在base R中通过用strsplit拆分两列来实现这一点,通过用Mappaste在相应的list元素上循环来获得setdiff

df1$Result <- unlist(Map(function(x, y) paste(sort(union(setdiff(y, x), 
setdiff(x, y))), collapse = ";"), 
strsplit(df1$Stringchain1, ";"), strsplit(df1$Stringchain2, ";")))

-输出

> df1
Stringchain1        Stringchain2  Result
1 A00;B01;C02;D03 A00;B01;C02;D03;E04     E04
2 E04;F05;G06;H07     F05;G06;H07;I08 E04;I08

数据

df1 <- structure(list(Stringchain1 = c("A00;B01;C02;D03", "E04;F05;G06;H07"
), Stringchain2 = c("A00;B01;C02;D03;E04", "F05;G06;H07;I08")), row.names = c(NA, 
-2L), class = "data.frame")

相关内容

最新更新