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

时间:2018-02-06 20:58:37

标签: r string tidyverse stringr

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

我想添加一个列,显示两个名称(.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元素的解决方案,但我会像我得到它一样。

2 个答案:

答案 0 :(得分: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

故障:

计算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)

答案 1 :(得分:2)

您可以使用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的原因}}