查找类似的字符串并在一个数据框中协调它们

时间:2017-08-04 15:00:11

标签: r string dataframe match

作为初学者的另一个问题。在这里考虑这个例子:

n = c(2, 3, 5)
s = c("ABBA", "ABA", "STING")
b = c(TRUE, "STING", "STRING")
df = data.frame(n,s,b)

n     s      b
1 2  ABBA   TRUE
2 3   ABA  STING
3 5 STING STRING

如何在此数据框中搜索类似的字符串,即ABBA和ABA以及STING和STRING并使它们相同(无论ABBA或ABA是否正常)都不需要我知道任何变化?我的实际data.frame非常大,因此不可能知道所有不同的变化。

我希望这样的东西返回:

> n = c(2, 3, 5)
> s = c("ABBA", "ABBA", "STING")
> b = c(TRUE, "STING", "STING")
> df = data.frame(n,s,b)

> print(df)
  n     s     b
1 2  ABBA  TRUE
2 3  ABBA STING
3 5 STING STING

我一直在寻找agrep或stringdist,但是那些引用了两个data.frames或者能够命名我不能列的列,因为我有很多这样的。 有人有想法吗?非常感谢! 最好的祝福, 斯蒂菲

1 个答案:

答案 0 :(得分:0)

这对我有用,但可能有更好的解决方案

这个想法是使用递归函数special,它使用agrepl,这是近似grep https://www.rdocumentation.org/packages/base/versions/3.4.1/topics/agrep的逻辑版本。请注意,您可以指定“错误容差”以使用agrep对类似字符串进行分组。使用agrepl,我将具有相似字符串的行拆分为xmutate s列到第一个出现的字符串,然后添加分组变量{{1} }。未包含在grp组中的其余行存储在ith中,并递归传递函数,直到y为空。

您需要y包,dplyr

install.packages("dplyr")

要更改字符串相似性的严格性,请更改library(dplyr) desired <- NULL grp <- 1 special <- function(x, y, grp) { if (nrow(y) < 1) { # if y is empty return data return(x) } else { similar <- agrepl(y$s[1], y$s) # find similar occurring strings x <- rbind(x, y[similar,] %>% mutate(s=head(s,1)) %>% mutate(grp=grp)) y <- setdiff(y, y[similar,]) special(x, y, grp+1) } } desired <- special(desired,df,grp)

之类的max.distance

输出

agrepl(x,y,max.distance=0.5)

删除分组变量

  n     s      b grp
1 2  ABBA   TRUE   1
2 3  ABBA  STING   1
3 5 STING STRING   2