检测两个字符串向量之间的差异
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
如果可能的话,我更愿意找到使用 tidyverse
和 stringr
元素的解决方案,但我会接受它。
使用 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
.
我有一个 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
如果可能的话,我更愿意找到使用 tidyverse
和 stringr
元素的解决方案,但我会接受它。
使用 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
.