3

この例のような文字列のアドレスを編集したいと思います:

test = c("[Mavlyanova, Nadira G.] Uzbek Acad Sci, GA Mavlyanov Inst Seismol, Tashkent 700135, Uzbekistan; [Markovic, Slobodan B.] Univ Novi Sad, Fac Sci, Chair Phys Geog, Novi Sad 21000, Serbia; [Rowell, G.] Univ Adelaide, Sch Chem & Phys, Adelaide, SA 5005, Australia; [Katarzynski, K.] Nicholas Copernicus Univ, Torun Ctr Astron, PL-87100 Torun, Poland; [Ansari, Z.; Boettcher, M.; Manschwetus, B.; Rottke, H.; Sandner, W.] Max Born Inst, D-12489 Berlin, Germany; [Milosevic, D. B.] Univ Sarajevo, Fac Sci, Sarajevo 71000, Bosnia & Herceg")  

国名だけを取得したい。これは私がこれまでに試したことです:

> testa <- gsub("\\[.*?\\] ", "", test) #remove square brackets  
> testa <- strsplit(testa, ";", fixed = TRUE) #split adresses  
> testa <- sapply(testa, function(x) gsub("^.*, ([A-Za-z ]*)$", "\\1", x)) #keep only what's after last comma  
> testa <- gsub("^ | $", "", testa) #remove spaces  
> testa  
     [,1]  
[1,] "Uzbekistan"  
[2,] "Serbia"  
[3,] "Australia"  
[4,] "Poland"  
[5,] "Germany"  
[6,] "Univ Sarajevo, Fac Sci, Sarajevo 71000, Bosnia & Herceg"  

残念ながら、これは最後のアドレスでは機能しません。代わりに次の出力を取得したいと思います。

> testa  
     [,1]                                                       
[1,] "Uzbekistan"  
[2,] "Serbia"  
[3,] "Australia"  
[4,] "Poland"  
[5,] "Germany"  
[6,] "Bosnia & Herceg"  

私の質問は次のとおりです。

  • sapply-function の最後のアドレスでも正しく動作しないエラーは何ですか?
  • 正しい出力を達成するためにどのように改善できますか?
4

4 に答える 4

4

逆方向に作業しないのはなぜですか?

testa <- gsub("\\[.*?\\] ", "", test)
testa <- strsplit(testa, ";", fixed = TRUE)
# Remaining steps in question are unnecessary with the solution below

> sub(".+, ([A-Za-z& ]+)$","\\1",testa[[1]])
[1] "Uzbekistan"      "Serbia"          "Australia"       "Poland"          "Germany"         "Bosnia & Herceg"
于 2012-07-02T13:28:51.060 に答える
2

コードの問題は、コードの「最後のコンマの後のすべて」の部分が、[A-Za-z ]その後の唯一の有効な文字として使用されることです。このセットには が含まれていない&ため、最後のアドレスに対して置換は実行されません。おそらく[^,]、代わりに「カンマ以外のすべて」を示すために使用する必要があります。

于 2012-07-02T13:33:55.880 に答える
1

ここにはすでにいくつかのより良い回答がありますが、私はこの問題を解決したので、まだ投稿すると思いました:

y <- unlist(strsplit(test, "\\["))
y <- y[y!=""]
z <- sapply(y, function(x) strsplit(x, ","))
lens <- sapply(z, length)
a <- sapply(seq_along(z), function(i) z[[i]][lens[i]])
a <- gsub(";", "", a)
Trim <- function (x) gsub("^\\s+|\\s+$", "", x)
Trim(a)
于 2012-07-02T13:35:07.903 に答える
1

これは、gsubfn パッケージで使用するワンライナーですstrapplyc(またはstrapply動作しますが、こちらの方が高速です)。strapplyc最初に a を追加して";"から( regexp を使用して) testa を検索し、その後に[( regexp を使用して)"\\["以外の任意の文字列が続き、その後にコンマとスペース ( ) が続き、その後にコンマ、セミコロン、または( regexp ) の後にセミコロン ( ) を入力し、括弧内の部分のみを返します。 ["[^[]+"", "["([^,;[]+)";

> library(gsubfn)
> strapplyc(paste0(test, ";"), "\\[[^[]+, ([^,;[]+);", simplify = TRUE)
     [,1]             
[1,] "Uzbekistan"     
[2,] "Serbia"         
[3,] "Australia"      
[4,] "Poland"         
[5,] "Germany"        
[6,] "Bosnia & Herceg"
于 2012-07-02T15:03:32.383 に答える