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を作成します。名前の修正を間違える可能性があるため、元のレコードを維持することが重要です。

正規表現を使用してより簡潔にすることもできますが、とにかくリテラルが不要で必要な場所がある可能性があります。例の最初の部分を考えると、正規表現を使用すると、コードをもう少し簡潔にすることができる場合があります。しかし、この種の例では、たくさんの行をコピーして貼り付け、文字通りの変更を使用して、それらをうまくコメントしたいと思います。しばらくしてから戻って、特定の村の名前をどこでどのように変更したかを正確に知りたいからです。かわった。

良好な記録保持をもたらす別の方法は、一意のベクトルをファイルにエクスポートし、修正された名前を含む新しい列を作成することです。そのファイルからこれらの2つのベクトルをインポートし、新しいベクトルを使用して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

名前を他の名前にマッピングするだけの場合は、subまたはは必要ありませんgsubgsub文字列内のインスタンスを置き換えるため、問題が発生していると思われます。文字列全体のみを一致させようとしています。

次の2つのいずれかを試してください。

#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 に答える