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

Detecting the differences between two string vectors

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

我想添加一个列来显示两个 name(.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

如果可能的话,我更愿意找到使用 tidyversestringr 元素的解决方案,但我会接受它。

使用 base 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

细分:

计算 df[,1]df[,2]

之间的近似字符串距离
  d=adist(df$name,df$name.2, counts = TRUE)

获取变换矩阵的对角线:

   e= diag(attr(d, "trafos"))

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

    f=regexpr("[^M]",e)

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

     dat$diff==regmatches(name.2,f)

您可以使用 vecsets 库:

library(vecsets)
df$diff <- mapply(vsetdiff, strsplit(df$name.2, split = ""),
                            strsplit(df$name, split = ""))

df
#  name name.2 diff
#1 john  johhn    h
#2 bill   ball    a
#3  amy   ammy    m

请注意,您似乎只需要 name.2 中不在 name 中的值,这就是 mapply 的第一个参数是 strsplit 的原因 name.2.