2

タブ区切りのテキストファイルからdata.frameにデータをインポートしました。次に、C1という列の内容を調整および編集します。この目的のために正規表現が推奨されました。最初に使用したもの:

for (rn in 1:length(C1))
C1s <- strsplit(as.character(C1[rn]), "; ", fixed = TRUE)[[1]]

次のような例の個々のエントリを区切るには:

  • [Zhang、Junling] China Agr Univ、Coll Resources&Environm Sci、Beijing 100094、Peoples R China; [Zhang、Junling]ホーエンハイム大学、Inst Plant Nutr、D-7000シュトゥットガルト、ドイツ。[George、Eckhard] Humboldt Univ、Inst Crop Sci、Dept Plant Nutr、D-14979 Grossbeeren、Germany; [George、Eckhard] Leibniz Inst Vegetable&Ornamental Crops Theodor、D-14979 Grossbeeren、Germany
  • UNIV DORTMUND、INST PHYS、D-44221 DORTMUND、GERMANY; HUMBOLDT UNIV、INST PHYS、D-15738 ZEUTHEN、ドイツ
  • UNIV KEELE、DEPT CHEM、KEELE ST5 5BG、STAFFS、ENGLAND; MT SINAI HOSP、MT SINAI SCH MED、DR AA FISHBERG CTR NEUROBIOL、ニューヨーク、NY 10029; HUMBOLDT UNIV BERLIN、CHARITE HOSP、DEPT PATHOL&CLIN BIOCHEM、ベルリン、ドイツ
  • NIFAD、MOLEC MICROBIOL LAB、BETHESDA、MD

それから私はしたかった

  • すべて大文字に設定します
  • 文字列「Humboldt...Germany」を「HUMBOLDT」に置き換えます。文字列「England」、「Scotland」、「Wales」、および「NorthIreland」を「UNITEDKINGDOM」に置き換えます。
  • 米国の州の略語と郵便番号の組み合わせを「USA」に置き換えます
  • 米国の州の略語を「USA」に置き換えます

さらに、セミコロン(その後ろのスペースを含む)、その直前の単語、および上記の例の最後の単語以外のすべてを削除したいと思いました。
使用しました

gsub('[.*\\] ', ''(toupper(C1s))  

gsub(',\\s*', ','(toupper(C1s))  

、例えば、しかしそれを正しく動作させることができませんでした。
次の出力を取得したいと思います。

  • PEOPLES R CHINA; ドイツ; HUMBOLDT; ドイツ
  • ドイツ; HUMBOLDT
  • イギリス; アメリカ合衆国; HUMBOLDT
  • アメリカ合衆国

だから私の質問は:どうすれば私が望む結果を達成できますか?
よろしくお願いします!

更新と追加の問題

mrdwabの有益な返信とコメントのおかげで、私は多くの前進を遂げました。

残念ながら、角かっこで囲まれた複数の作成者が含まれるこのようなアドレスもあることに気付いたのは今だけです。残念ながら、mrdwabによって提案されたアルゴリズムはこれらでは正しく機能しません。

> test = c("[Bocquet, F. C.; Giovanelli, L.; Abel, M.; Porte, L.; Themlin, J. -M.] Aix Marseille Univ, Inst Mat Microelect & Nanosci Prov IM2NP, F-13397 Marseille 20, France; [Bocquet, F. C.; Giovanelli, L.; Abel, M.; Porte, L.; Themlin, J. -M.] CNRS, Inst Mat Microelect & Nanosci Prov IM2NP, UMR 6242, Marseille, France; [Amsalem, P.; Koch, N.] Humboldt Univ, Inst Phys, D-12489 Berlin, Germany; [Petaccia, L.; Topwal, D.; Gorovikov, S.; Goldoni, A.] Sincrotrone Trieste, I-34149 Trieste, Italy")

これは私が得た結果です:

> test
[1] "[BOCQUET,  F. C." "GIOVANELLI,  L."  "ABEL,  M."        "PORTE,  L."      
[5] "FRANCE"           "[BOCQUET,  F. C." "GIOVANELLI,  L."  "ABEL,  M."       
[9] "PORTE,  L."       "FRANCE"           "[AMSALEM,  P."    "HUMBOLDT"        
[13] "[PETACCIA,  L."   "TOPWAL,  D."      "GOROVIKOV,  S."   "ITALY" 

これは私が代わりに取得したい結果です:

[1] "FRANCE"; "FRANCE"; "HUMBOLDT"; "ITALY"

各角括弧とその内容を個別に削除するために、これを使用してみました。

C1s = gsub("(.*)[(.*)]", "\\2", C1s)

しかし、その代わりに、最初の開始ブラケットと最後の終了ブラケットの間のすべてが削除されました...最初に角括弧内のすべてのセミコロンをコンマに置き換えればうまくいくでしょうか?私は試した

C1s = gsub("[(.*);(.*)]", "[(.*),(.*)]", C1s)

それを達成するために、しかしそれはうまくいきませんでした。
だから私はその点であなたの助けに感謝します!

それに加えて、残念ながら、私はまだ自分では解決できないように見えるさらに別の障害に立ち往生しています...
これは私の現在の出力です:

> C1s
[1] "PEOPLES R CHINA" "GERMANY"         "HUMBOLDT"         "GERMANY"
[5] "GERMANY"         "HUMBOLDT"        "UNITED KINGDOM"   "USA"
[9] "HUMBOLDT"        "USA"
> dims
[1] 4 2 3 1
> is.list(C1)
[1] FALSE
> is.vector(C1)
[1] TRUE

しかし、この望ましい出力を作成するため に、どのように正確にdimsの情報を使用できますか?:

[1] "PEOPLES R CHINA"; "GERMANY"; "HUMBOLDT"; "GERMANY"
[2] "GERMANY"; "HUMBOLDT"
[3] "UNITED KINGDOM"; "USA"; "HUMBOLDT"
[4] "USA"

よろしくお願いします!

4

1 に答える 1

3

データが次のようになっていると仮定します。

test = c("[Zhang, Junling] China Agr Univ, Coll Resources & Environm Sci, Beijing 100094, Peoples R China", 
         " [Zhang, Junling] Univ Hohenheim, Inst Plant Nutr, D-7000 Stuttgart, Germany", 
         " [George, Eckhard] Humboldt Univ, Inst Crop Sci, Dept Plant Nutr, D-14979 Grossbeeren, Germany", 
         " [George, Eckhard] Leibniz Inst Vegetable & Ornamental Crops Theodor, D-14979 Grossbeeren, Germany"
)

まず、すべて大文字にします。

test = toupper(test)

HUMBODT次に、 ...GERMANYをに変更しましょうHUMBOLDT

test = gsub("(.*)(HUMBOLDT)(.*)", "\\2", test)

次に、文字列の最後の部分を抽出してみましょう。

test = gsub("(.*), +([A-Z ]+$)", "\\2", test)
> test
[1] "PEOPLES R CHINA" "GERMANY"         "HUMBOLDT"        "GERMANY"    

あなたからもっと完全な例があれば、他の部分も手伝うことができるかもしれません。

アップデート

これは、何をすべきかを理解するのに役立つ、ほとんど機能するソリューションです。

「スキャン」を使用して投稿からデータをコピーすると、次のようなデータを取得できます。

test = c("[Zhang, Junling] China Agr Univ, Coll Resources & Environm Sci, Beijing 100094, Peoples R China; [Zhang, Junling] Univ Hohenheim, Inst Plant Nutr, D-7000 Stuttgart, Germany; [George, Eckhard] Humboldt Univ, Inst Crop Sci, Dept Plant Nutr, D-14979 Grossbeeren, Germany; [George, Eckhard] Leibniz Inst Vegetable & Ornamental Crops Theodor, D-14979 Grossbeeren, Germany", 
         "UNIV DORTMUND,INST PHYS,D-44221 DORTMUND,GERMANY; HUMBOLDT UNIV,INST PHYS,D-15738 ZEUTHEN,GERMANY", 
         "UNIV KEELE,DEPT CHEM,KEELE ST5 5BG,STAFFS,ENGLAND; MT SINAI HOSP,MT SINAI SCH MED,DR A A FISHBERG CTR NEUROBIOL,NEW YORK,NY 10029; HUMBOLDT UNIV BERLIN,CHARITE HOSP,DEPT PATHOL & CLIN BIOCHEM,BERLIN,GERMANY", 
         "NIFAD,MOLEC MICROBIOL LAB,BETHESDA,MD")

必要な変換を行うには、段階的に進める必要があります。これが私がそれをした方法です。

test.orig = test # A backup, just in case
test = toupper(test) # To uppercase
test = strsplit(test, ";") # Split everything up into a list
dims = sapply(test, length) # We might need this later
test = unlist(test) # Now, a single vector
test = gsub(",", " , ", test) # Pad those commas with some space
# Replace any 'HUMBOLDT'...'GERMANY' stuff with 'HUMBOLDT'
test = gsub("(.*)(HUMBOLDT)(.*)(GERMANY$)", "\\2", test)
# Replace a bunch of stuff with 'UNITED KINGDOM'
test = gsub("ENGLAND|SCOTLAND|WALES|NORTH IRELAND", "UNITED KINGDOM", test)
# Search for a pair of letters followed by a space followed by five digits
# and replace it with USA
test = gsub(" [A-Z]{2} [0-9]{5}", " USA", test)
# Find the item following the last comma
test = gsub("(.*), ([A-Z ]+)$", "\\2", test)
# Remove any whitespace
test = gsub("^ | $", "", test)
> test
[1] "PEOPLES R CHINA" "GERMANY"         "HUMBOLDT"        "GERMANY"        
[5] "GERMANY"         "HUMBOLDT"        "UNITED KINGDOM"  "USA"            
[9] "HUMBOLDT"        "MD"                  
# Unlist it if you need to
> split(test, rep(dims, dims))
$`1`
[1] "MD"

$`2`
[1] "GERMANY"  "HUMBOLDT"

$`3`
[1] "UNITED KINGDOM" "USA"            "HUMBOLDT"      

$`4`
[1] "PEOPLES R CHINA" "GERMANY"         "HUMBOLDT"        "GERMANY"   

ただし、州の略語をUSAに置き換える方法と、同じ行の順序に戻す方法を理解する作業はお任せします。

于 2012-05-07T09:33:43.957 に答える