gpt4 book ai didi

使用条件减少 'while loop'

转载 作者:行者123 更新时间:2023-12-04 09:07:14 26 4
gpt4 key购买 nike

从总体上看,我的目标是仅打印具有相似/相同字段名称的行而不重复。也就是说,如果三行重复,则每行只打印一次(而不是每个成对比较)。

要重现的最小数据集和库:

library(stringdist)
trye <- data.frame(names = c('aa','aa','aa','bb','bb','cc'),
values = 1:6,
id = c('row 1', 'row 2', 'row 3', 'row 4', 'row 5', 'row 6'),
stringsAsFactors = FALSE)

我的预期输出将是具有相同/相似名称(1、2、3、4 和 5)的行:
trye 
# names values id
# 1 aa 1 row 1
# 2 aa 2 row 2
# 3 aa 3 row 3
# 4 bb 4 row 4
# 5 bb 5 row 5

这里有两次没有奏效的尝试(一些其他修改引发了错误):
#this one prints row 1,2,3,3,5,5
i <- 1
while (i < length(trye$names)) {

dupe <- amatch(trye$names[[i]],trye$names[-i], maxDist = 1)

if(dupe + 1 > 0) {
print(trye[i,])
duperow <- dupe + 1
print(trye[duperow,])
trye <- trye[-c(i), ]
i <- i + 1


} else {
i <- i + 1
trye <- trye[-c(i), ]
}

}



# this one prints rows 1,2,4,5 which is almost correct,
# it's missing row 3 (as it shares the name with row 1 and 2.
i <- 1
while (i < length(trye$names)) {

dupe <- amatch(trye$names[[i]],trye$names[-i], maxDist = 1)

if(dupe + 1 > 0) {
print(trye[i,])
duperow <- dupe + 1
print(trye[duperow,])
trye <- trye[-c(i,duperow), ]
i <- i + 1


} else {
i <- i + 1
trye <- trye[-c(i,duperow), ]
}

}

请注意,实际数据集很大,因此删除行以缩小比较对我来说似乎(或似乎)是个好主意,而且实际集中的最大距离大于 1。

最佳答案

您可以使用 adist从 base 开始,获得 Levenshtein 距离,并过滤那些至少有一个匹配项(除了他们自己):

sapply(1:nrow(trye), function(x) sum(adist(trye[x,1], trye[,1])==0)>1)

如果您的数据非常大如 adist很昂贵,您可以删除所有重复项,除了第一个和最后一个:
trye[(!duplicated(trye$names) | rev(!duplicated(rev(trye$names)))),]

并在之后重新添加它们。您可能还想查看 openrefine这是一种可以加快速度的方法。

关于使用条件减少 'while loop',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34996422/

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