检测两个字符串向量之间的差异

ell*_*iot 3 string r stringr tidyverse

我有一个data_frame看起来像这样的东西.

df <- data_frame(name = c('john','bill','amy'),
           name.2 = c('johhn','ball','ammy')) 
df
# A tibble: 3 x 2
   name name.2
  <chr>  <chr>
1  john  johhn
2  bill   ball
3   amy   ammy
Run Code Online (Sandbox Code Playgroud)

我想添加一个列,显示两个名称(.2)列之间的差异.像这样:

df %>% 
mutate(diff = c('h','a','m')) 
# A tibble: 3 x 3
   name name.2  diff
  <chr>  <chr> <chr>
1  john  johhn     h
2  bill   ball     a
3   amy   ammy     m
Run Code Online (Sandbox Code Playgroud)

我宁愿发现使用的元素的溶液tidyversestringr可能的话,但我还是要像我得到它.

Ony*_*mbu 7

使用基数R我们可以使用以下内容:

diffc=diag(attr(adist(df$name,df$name.2, counts = TRUE), "trafos"))
transform(df,diff=regmatches(name.2,regexpr("[^M]",diffc)))
  name name.2 diff
1 john  johhn    h
2 bill   ball    a
3  amy   ammy    m
Run Code Online (Sandbox Code Playgroud)

分解:

计算df[,1]和之间的近似字符串距离df[,2]

  d=adist(df$name,df$name.2, counts = TRUE)
Run Code Online (Sandbox Code Playgroud)

获得变换矩阵的对角线:

   e= diag(attr(d, "trafos"))
Run Code Online (Sandbox Code Playgroud)

找到被删除,替换或插入的位置,即未维护的位置:

    f=regexpr("[^M]",e)
Run Code Online (Sandbox Code Playgroud)

提取df[,2]那些指定位置的值:

     dat$diff==regmatches(name.2,f)
Run Code Online (Sandbox Code Playgroud)