作为初学者的另一个问题。在这里考虑这个例子:
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或者能够命名我不能列的列,因为我有很多这样的。 有人有想法吗?非常感谢! 最好的祝福, 斯蒂菲
答案 0 :(得分:0)
这对我有用,但可能有更好的解决方案
这个想法是使用递归函数special
,它使用agrepl
,这是近似grep https://www.rdocumentation.org/packages/base/versions/3.4.1/topics/agrep的逻辑版本。请注意,您可以指定“错误容差”以使用agrep
对类似字符串进行分组。使用agrepl
,我将具有相似字符串的行拆分为x
,mutate
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