2017-07-28 111 views
1

我正在清理書目數據庫的過程中,第一次與R一起工作。其中一列,我的變量是一列,其中包含所有引用問題已經引用,並且看起來像這樣:R:帶有通配符和幾個條件的Gsub

ANDREOSSO-O'CALLAGHAN B,2008,PALGRAVE STUD EUR UN,P61。 ALECU DE FLERS N,2005,INT RELATIONS EUROPE,P317。 DUCHENE FRANCOIS,1973,NATION WRIT LARGE FO。 KOH T,2007,海峽時報0808. LENZ T,2009,GEOPOLITICS GEOECONO。 LUCARELLI S,2010,ROUTL GARN SER EUR歐元W,V7,P1。 MANNERS I,2002,J COMMON MARK STUD,V40,P235,DOI 10.1111/1468-5965.00353。 NYE J.,2004,SOFT POWER MEANS SUC。 ORBIE J,2010,NORMATIVE POWER EURO。 PORTELA C,2007,200710 RSCAS。 ROSECRANCE R.,1998,PARADOXES EUROPEAN F. SMITH K.E.,2003,EUROPEAN FOREIGN POL。 SONG XN,2010,REV INT STUD,V36,P755,DOI 10.1017/S0260210510000835。 TANAKA T,2008,PALGRAVE STUD EUR UN,P170。 WARLEIGH-LACK A.,2010,COMP REGIONAL INTEGR,P43。

我碰到的問題是,基本上相同的參考文件出現在許多不同的僞裝。在上述情況下,看起來像這樣

  • NYE J.,2004,SOFT POWER MEANS SUC。

在其他情況下,它看起來像這樣:

  • NYE J.,2004,軟實力:中的成功在世界政治,紐約:公共事務

有該參考文獻至少有30個不同的獨特版本。我可以通過作者的名字在我的數據庫中找到它們--NYE J.,2004年的出版年,並提到「成功的手段」。因此,我的想法是使用gsub函數,該函數將在該列中的分隔符內(這是一個點和兩個空格)搜索這些參數,並用

代替整個表達式
  • NYE J.,2004,SOFT POWER :中的成功在世界政治,紐約:公共事務

到現在,我能夠做簡單的GSUB的,所以我設法取代奈先生奈J.的所有變化,但我通過手動搜索所有變體,現在不再可行了。我想基本上做到這一點:

help2 <- within(help2, { values <- gsub (x= CR, pattern = "NYE J., 2004,*means to suc*. ", replacement = "NYE J., 2004, SOFT POWER: THE MEANS TO SUCCESS IN WORLD POLITICS, NEW YORK: PUBLICAFFAIRS")}) 

我知道通配符R中不同的工作,但我不能找出我需要改變。任何人的想法?曼特謝謝! 最好的問候, 施特菲

+0

這些3份可以有不同的訂單? –

+0

嘗試https://ideone.com/RD8OPu –

+0

任何反饋?... –

回答

1

你的代碼可以是以下幾點:

pat <- "(?i)(^|\\. +)NYE J\\.(?:(?!\\. {2}).)*?\\b2004\\b(?:(?!\\. {2}).)*?means suc(?:(?!\\. {2}).)*" 
repl <- "\\1NYE J., 2004, SOFT POWER: THE MEANS TO SUCCESS IN WORLD POLITICS, NEW YORK: PUBLICAFFAIRS" 
explain$CR <- gsub(pat, repl, explain$CR, perl=TRUE) 

R demo

regex demo

圖案的詳細資料

  • (?i) - 不區分大小寫的改性劑使圖案不區分大小寫
  • (?:^|\. +) - 串(^)或點的開始,隨後有2個或多個空格
  • NYE J\. - 字面NYE J.子(點必須轉義以匹配文字點)
  • (?:(?!\. {2}).)*? - 比換行符字符以外的任何字符(.),零個或多個,儘可能少,不啓動一個.和2個或更多的空間序列
  • \b2004\b - 2004作爲一個完整的單詞(如\b字界限)
  • (?:(?!\. {2}).)*? - 任何字符不是換行字符等(.),零個或多個,儘可能少,不啓動.和2個或更多的空間序列
  • means suc - 字面means suc
  • (?:(?!\. {2}).)* - - 比換行符字符(.),零個或多個其它任何字符,如許多越好,不啓動一個.和2個或更多的空間序列。

在替換模式的\\1被反向引用的值在組拍攝1.