我有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
如果可能的话,我更愿意找到使用tidyverse
和stringr
元素的解决方案,但我会像我得到它一样。
答案 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
的原因}}