gpt4 book ai didi

r - 根据 Levenshtein 距离为 R 中的相似行分配唯一索引

转载 作者:行者123 更新时间:2023-12-01 13:52:15 24 4
gpt4 key购买 nike

我正在尝试弄清楚如何分配索引以识别 R 中的相似行。示例数据如下

test_data <- data.frame(char_name = c("star Lord", "Star Lords", "Star Lords", "Star Lord", 
rep("Gamora", 2), rep("GamOOOra", 2)),
address = rep(c("Space", "Universe"), 4),
phone = c(rep(123, 4), rep(456, 4)))

以及所需的输出:

output_data <- data.frame(char_name = c("star Lord", "Star Lords", "Star Lords", "Star Lord", 
rep("Gamora", 2), rep("GamOOOra", 2)),
address = (c(rep(c("Space", "Universe"), 4))),
phone = c(rep(123, 4), rep(456, 4)),
same_person_ind = c(rep(1, 4), rep(2, 4)))

same_person_ind 的逻辑是:

  1. 根据小于或等于 3 的 Levenshtein 距离将具有相似 char_name 的项目分组
  2. 对于每组相似的char_name,如果addressphone 的编辑距离小于或等于3,则分配一个组的唯一标识符。

我已经查看了 stringdistdplyr 包,但我不知道如何在 R 中实现我的逻辑。任何帮助将不胜感激。

非常感谢,

最佳答案

这是一个辅助函数,它根据一定的距离对向量的元素进行分组。我在这里使用 adist:

### col.     : vector of words to search by distance
### max_dist : maximum distance between similar words
create_groups <-
function(col.,max_dist=3) {
nn <- as.character(col.)
grp_names_id <-
as.data.frame(t(unique((adist(nn)<max_dist))))

.to_data_frame <-
function(x)
data.frame(char_name=nn[grp_names_id[,x]],grp=x)
res <-
unique(do.call(rbind,
lapply(seq_len(ncol(grp_names_id)),
.to_data_frame)))

res
}

例如,将此应用于 char_name 我们得到 3 个组:

res <- create_groups(test_data$char_name)
## char_name grp
## 1 star Lord 1
## 2 Star Lords 1
## 4 Star Lord 1
## 5 Gamora 2
## 7 GamOOOra 3

将此应用于您的数据并合并结果:

res <- create_groups(test_data$char_name)
res <- merge(test_data,res
## char_name address phone grp
## 1 GamOOOra Space 456 3
## 2 GamOOOra Universe 456 3
## 3 Gamora Space 456 2
## 4 Gamora Universe 456 2
## 5 star Lord Space 123 1
## 6 Star Lord Universe 123 1
## 7 Star Lords Universe 123 1
## 8 Star Lords Space 123 1

现在的想法是对上一步中已经形成的子组应用相同的过程。这里很自然地使用data.table来分组应用操作。例如:

library(data.table)
setkey(setDT(res),grp,char_name)

res[,c("key","grp1"):= {
create_groups(address)

},"grp,char_name"]

## char_name address phone grp key grp1
## 1: star Lord Space 123 1 Space 1
## 2: Star Lord Universe 123 1 Space 1
## 3: Star Lords Universe 123 1 Space 1
## 4: Star Lords Space 123 1 Universe 2
## 5: Gamora Space 456 2 Space 1
## 6: Gamora Universe 456 2 Universe 2
## 7: GamOOOra Space 456 3 Space 1
## 8: GamOOOra Universe 456 3 Universe 2

关于r - 根据 Levenshtein 距离为 R 中的相似行分配唯一索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30852008/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com