我正在清理书目数据库,第一次使用R。其中一个列,即我的变量,是一个包含所引用的所有引用的列,并查找实例像这样:
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,STRAITS TIMES 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。
我遇到的问题是在许多不同的伪装中出现了基本相同的引用。在上面的例子中,它看起来像这样
在其他情况下,它看起来像这样:
此参考文献至少有30种不同的独特版本。我可以通过作者的名字在我的数据库中识别它们 - NYE J.,出版年份,2004年,以及提及"成功的方法"。所以我的想法是使用一个gsub函数来搜索那些参数中的分隔符(这是一个点和两个空格),并用
替换整个表达式到现在为止,我能够做简单的gsub,因此我设法用NYE J.替换了Nye先生的所有变体,但是我通过手动搜索所有变化来做到这一点现在不可行了。我想基本上这样做:
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 :(得分: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}).)*
- - 除了换行符(.
)之外的任何字符,零个或多个出现次数,尽可能很多,但不会启动{{1} }和2个或更多空格序列。替换模式中的.
是对第1组中捕获的值的反向引用。