1

我尝试使用 gsub、sub 等替换我的大数据框架(all_health)中的村庄名称,但我不断得到一些未正确更改的村庄。例如,我想首先标准化数据中所有村庄(vlg)的拼写。例如:

all_health$vlg<-gsub("FALAJALQBA","FALAJALQABAIL",all_health$vlg)
all_health$vlg<-gsub("FALAJALQ","FALAJALQABAIL",all_health$vlg)
all_health$vlg<-gsub("FALAJALQBA","FALAJALQABAIL",all_health$vlg)
all_health$vlg<-gsub("FALAJALQA","FALAJALQABAIL",all_health$vlg)
all_health$vlg<-gsub("FALAJALQBAEIL","FALAJALQABAIL",all_health$vlg)
all_health$vlg<-gsub("FALAJALQBAIL","FALAJALQABAIL",all_health$vlg)
all_health$vlg<-gsub("FALAJALQUBAIL","FALAJALQABAIL",all_health$vlg)

然后我想将生成的村庄名称更改为另一个名称:

 all_health$vlg<-gsub("FALAJALQABAIL","ALKHUWAYRIYAH",all_health$vlg)

然而,当我重新检查村庄的名称时,我注意到新的不同(错过)村庄,例如 (ALKHUWAYRIYAHBAILUBAIL) ,看起来像是村庄的组合。

我有许多其他村庄的行为也一样。

我是否使用了正确的功能?有人可以帮帮我吗?

4

2 回答 2

0

R 没有什么神奇的方法可以为你找出所有的拼写。你需要做的第一件事是...

unique(all_health$vlg)

遍历生成的向量并将所有内容制成您认为村庄应该是的表格。并创建一个新列,也许是 cvlg。保留原始记录很重要,因为您可能会在修改名称时出错。

您可能可以使用正则表达式使其更简洁,但似乎有可能存在您不能并且无论如何都需要文字的地方。鉴于您示例的第一部分,正则表达式可能会使您的代码更加简洁。但是在这种情况下,我很想复制和粘贴很多行,使用文字更改并很好地注释它们,因为您稍后会回去并想知道您更改某个村庄名称的确切位置以及它是如何更改的被改变了。

一种可以保持良好记录的替代方法可能是将唯一向量导出到文件中,并在其中创建一个包含更正名称的新列。您可以从该文件中导入这两个向量,并使用新向量轻松更改 R 中的所有名称。你只需要首先保留那些错误的。

要写出名称,请使用...

write.table(unique(all_health$vlg)), 'villageNameCorrections.txt', row.names = FALSE, quote = FALSE)

编辑文件并适当地标记列“旧”和“新”。现在您的 R 代码将是。

correctVlg <- read.table('villageNameCorrections.txt', header = TRUE)
all_health$cvlg <- all_health$vlg
all_health$cvlg[all_health$cvlg %in% correctVlg$old] <- 
    correctVlg$new[na.omit(match(ifelse (all_health$cvlg, correctVlg$old))]
于 2012-10-29T12:38:03.963 回答
0

如果您只是将名称映射到其他名称,则不需要subor gsub。我怀疑您遇到了问题,因为gsub替换了字符串中的任何实例,并且您只希望匹配整个字符串。

尝试执行以下两项之一:

#ensures matching of whole string by including 
#start-of-line and end-of-line characters
all_health$vlg<-gsub("^FALAJALQBA$","FALAJALQABAIL",all_health$vlg)
#and so on

#or, use %in%:
names.to.replace <- c("FALAJALQBA","FALAJALQ") #include all misspelled names
all_health$vlg[all_health$vlg %in% names.to.replace] <- "FALAJALQABAIL"
于 2012-10-29T12:54:25.970 回答