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)
我宁愿发现使用的元素的溶液tidyverse和stringr可能的话,但我还是要像我得到它.
使用基数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)