在 R 中通过相似 characters/strings 匹配两个向量
match two vectors by similar characters/strings in R
我有两个向量,比如
v1<-c("yellow", "red", "orange", "blue", "green")
v2<-c("blues", "redx", "grean")
,我想匹配它们,即,将 v1
的每个元素与 v2
上最相似的元素“link”,这样结果就是
> df
v1 v2
1 yellow <NA>
2 red redx
3 orange <NA>
4 blue blues
5 green grean
下面的代码给出了预期的结果,但只是因为它手动“格式化”了才这样做
df<-data.frame(v1,v2=rep(NA,5))
for (i in 1:nrow(df)) {
ag<-agrep(df[i,1], v2, ignore.case = T, value = T)
if (length(ag)==0) {df[i,2]<-NA}
else if (length(ag)==1) {df[i,2]<-ag}
else {df[i,2]<-ag[1]}
}
碰巧 agrep(df[2,1], v2, max.distance = 0.00001, ignore.case = T, value = T)
结果是 "redx" "grean"
,即使我设置 max.distance = 0.00001
.
这就是为什么我有 if 条件,但它不能保证选择最相似的答案。
我该如何解决这个问题?
提前致谢
也许以下可以解决您的问题。它使用包 stringdist
中的 stringdistmatrix
,如果向量 v1
和 v2
较大,这可能会成为内存问题。
d <- stringdist::stringdistmatrix(v1, v2, method = "osa")
i <- which(colSums(d == 1) > 0)
j <- which(rowSums(d == 1) > 0)
df$v2[j] <- v2[i]
df
# v1 v2
#1 yellow <NA>
#2 red blues
#3 orange <NA>
#4 blue redx
#5 green grean
你可以试试:
s <- which(adist(v1,v2) <= 1, TRUE) # 1 is the maximum allowed change
data.frame(v1, v2=replace(NA, s[,1], v2[s[,2]]))
v1 v2
1 yellow <NA>
2 red redx
3 orange <NA>
4 blue blues
5 green grean
我有两个向量,比如
v1<-c("yellow", "red", "orange", "blue", "green")
v2<-c("blues", "redx", "grean")
,我想匹配它们,即,将 v1
的每个元素与 v2
上最相似的元素“link”,这样结果就是
> df
v1 v2
1 yellow <NA>
2 red redx
3 orange <NA>
4 blue blues
5 green grean
下面的代码给出了预期的结果,但只是因为它手动“格式化”了才这样做
df<-data.frame(v1,v2=rep(NA,5))
for (i in 1:nrow(df)) {
ag<-agrep(df[i,1], v2, ignore.case = T, value = T)
if (length(ag)==0) {df[i,2]<-NA}
else if (length(ag)==1) {df[i,2]<-ag}
else {df[i,2]<-ag[1]}
}
碰巧 agrep(df[2,1], v2, max.distance = 0.00001, ignore.case = T, value = T)
结果是 "redx" "grean"
,即使我设置 max.distance = 0.00001
.
这就是为什么我有 if 条件,但它不能保证选择最相似的答案。
我该如何解决这个问题?
提前致谢
也许以下可以解决您的问题。它使用包 stringdist
中的 stringdistmatrix
,如果向量 v1
和 v2
较大,这可能会成为内存问题。
d <- stringdist::stringdistmatrix(v1, v2, method = "osa")
i <- which(colSums(d == 1) > 0)
j <- which(rowSums(d == 1) > 0)
df$v2[j] <- v2[i]
df
# v1 v2
#1 yellow <NA>
#2 red blues
#3 orange <NA>
#4 blue redx
#5 green grean
你可以试试:
s <- which(adist(v1,v2) <= 1, TRUE) # 1 is the maximum allowed change
data.frame(v1, v2=replace(NA, s[,1], v2[s[,2]]))
v1 v2
1 yellow <NA>
2 red redx
3 orange <NA>
4 blue blues
5 green grean