R 在同一行中标识相似的名称,然后选择模式

R 在同一行中标识相似的名称,然后选择模式,r,fuzzy-logic,agrep,R,Fuzzy Logic,Agrep,我的数据包括一个名称列。有些名字有多达八种不同的书写方式。我尝试使用以下代码对它们进行分组: groups <- list() i <- 1 while(length(x) > 0) { id <- agrep(x[1], x, ignore.case = TRUE, max.distance = 0.1) groups[[i]] <- x[id] x <- x[-id] i <- i + 1 } head(groups) groups

我的数据包括一个名称列。有些名字有多达八种不同的书写方式。我尝试使用以下代码对它们进行分组:

groups <- list()
i <- 1
while(length(x) > 0)
{
  id <- agrep(x[1], x, ignore.case = TRUE, max.distance = 0.1)
  groups[[i]] <- x[id]
  x <- x[-id]
  i <- i + 1
}

head(groups)
groups

我怎样才能到达那里?

这个答案很大程度上基于将字符串分组的方法。这个答案只是增加了查找每个组的模式,并将正确的模式分配给原始字符串

## The data
Names = c("John Snow", "Peter Wright",  "john snow",
    "John snow", "Peter wright", "J. Snow", "John Snow")

## Grouping like in the previous question
groups <- list()
i <- 1
x = Names
while(length(x) > 0)
{
  id <- agrep(x[1], x, ignore.case = TRUE, max.distance = 0.25)
  groups[[i]] <- x[id]
  x <- x[-id]
  i <- i + 1
}

## Find the mode for each group
Modes = sapply(groups, function(x) names(which.max(table(x))))

## Assign the correct mode to each string
StandardName = rep("", length(Names))
for(i in seq_along(groups)) {
    StandardName[Names %in% groups[[i]]] = Modes[i]
}

StandardName
[1] "John Snow"    "Peter wright" "John Snow"    "John Snow"    "Peter wright"
[6] "John Snow"    "John Snow" 
要编写结果以便从Excel中访问,请使用

write.csv(df, "MyData.csv")

除非您的问题与rstudio IDE有关,否则请不要使用rstudio标签。这可能会对您有所帮助。@xilliam领带在这种情况下不起作用。任何一个都可以选择。@G5W正如您所看到的,我的代码来自于该主题。但是,它不包括返回和添加每行模式的方法。感谢您的回复!现在,对于最后一步,我想知道如何将结果添加到数据框并将其写回Excel(我是R新手)。@G5W,再次感谢您的回复。现在的情况是,答案只添加了大约20%的时间。我认为这是因为name变量是一个因素。虽然我有7.000行,但只有约1.900个因子,因为许多符号被多次使用。有办法解决吗?如果name变量是一个因子,我建议在处理之前将其更改为字符串<代码>名称=as.character(名称)
df$StandardName = StandardName
write.csv(df, "MyData.csv")