我试图用gsub,sub和其他方法替换我的大数据框(all_health)中的村庄名称,但我不断改变一些村庄。 例如, 我想首先在数据中标准化所有村庄的拼写(vlg)。 e.g:
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),看起来像村庄的组合......
我有很多其他村庄表现得一样。
我使用的是正确的功能吗? 有人请帮助我吗?
答案 0 :(得分: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))]
答案 1 :(得分:0)
如果您只是将名称映射到其他名称,则不需要sub
或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"