Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
包countrycode和regex_R_Regex_Country - Fatal编程技术网

包countrycode和regex

包countrycode和regex,r,regex,country,R,Regex,Country,R包“countrycode”包含一个数据帧(countrycode_data),其中还包含一个名为“country.name.en.regex”的变量。这个变量包含正则表达式模式,我想使用它来创建一个新的列,该列是TRUE还是FALSE取决于国家名称或其变体是否出现在某些列中,请参见下面的示例 AB <- c('CHINAS PARTY CONGRESS','JAPAN-US RELATIONS','JAPAN TRIES TO') TI <- c('AMERICAN FOREIG

R包“countrycode”包含一个数据帧(countrycode_data),其中还包含一个名为“country.name.en.regex”的变量。这个变量包含正则表达式模式,我想使用它来创建一个新的列,该列是TRUE还是FALSE取决于国家名称或其变体是否出现在某些列中,请参见下面的示例

AB <- c('CHINAS PARTY CONGRESS','JAPAN-US RELATIONS','JAPAN TRIES TO')
TI <- c('AMERICAN FOREIGN POLICY', 'CHINESE ATTEMPTS TO', 'BRITAIN HAS TEA')
AU <- c('AUTHOR 1', 'AUTHOR 2','AUTHOR 3')
M  <- data.frame(AB,TI,AU)
M$Japan<- !!rowSums(sapply(M[c(1:3)], grepl, pattern ='JAPAN'))
我现在已经测试了所有提供的正则表达式,并意识到那些不起作用的正则表达式往往包含

^(?=.*或^(?).*

我还注意到,例如,单词边界不会用两个反斜杠转义(即原稿中的.\B而不是\B)。是否有一个我不知道的简单解决方案?或者另一种替代方法?下面是一些返回错误的正则表达式的完整示例:

M$China<- !!rowSums(sapply(M[c(3, 7:9)], grepl, pattern ="^(?!.*\\BMAC)(?!.*\\BHONG)(?!.*\\BTAI)(?!.*\\BREP).*CHINA|^(?=.*PEO)(?=.*REP).*CHINA"))
M$United_States_of_America<- !!rowSums(sapply(M[c(3, 7:9)], grepl, pattern ="UNITED.?STATES\\B(?!.*ISLANDS)|\\BU\.?S\.?A\.?\\B|^\S*U\.?S\.?\\B(?!.*ISLANDS)"))
M$Republic_of_Korea<- !!rowSums(sapply(M[c(3, 7:9)], grepl, pattern ="^(?!.*D.*P.*R)(?!.*DEMOCRAT)(?!.*PEOPLE)(?!.*NORTH).*\\BKOREA(?!.*D.*P.*R)"))
M$China这个
(?=.*REP)
构造是一个正向的前瞻性构造,默认的基本R正则表达式引擎(TRE)不支持它。要使用它们,您需要使用
perl=TRUE
,以便使用PCRE正则表达式引擎来处理模式

但是,请注意,
^(?=.*REP)。*捷克|捷克|波希米亚
可以重新写入以与TRE正则表达式引擎一起使用:

REP.*CZECH|CZECH.*REP|CZECHIA|BOHEMIA
^^^^^^^^^^^^^^^^^^^^^

如果您有不止一个积极的前瞻性,那么这种方法可能会被证明是乏味的,而且实际上效率更低。

似乎只要按预期使用
countrycode
包,您就应该能够更轻松地做到这一点


AB要使前瞻模式起作用,请添加
perl=TRUE
。此外,您想要的捷克正则表达式应该看起来像
“^(?=.*REP)。*(?:捷克(?:IA)?|波希米亚)
谢谢,Wiktor。我没有想到perl,但它似乎起到了作用。为什么您必须更改捷克正则表达式?只是习惯的力量。我认为
^(?=.*REP).
参考了
捷克|捷克|波希米亚
M$China<- !!rowSums(sapply(M[c(3, 7:9)], grepl, pattern ="^(?!.*\\BMAC)(?!.*\\BHONG)(?!.*\\BTAI)(?!.*\\BREP).*CHINA|^(?=.*PEO)(?=.*REP).*CHINA"))
M$United_States_of_America<- !!rowSums(sapply(M[c(3, 7:9)], grepl, pattern ="UNITED.?STATES\\B(?!.*ISLANDS)|\\BU\.?S\.?A\.?\\B|^\S*U\.?S\.?\\B(?!.*ISLANDS)"))
M$Republic_of_Korea<- !!rowSums(sapply(M[c(3, 7:9)], grepl, pattern ="^(?!.*D.*P.*R)(?!.*DEMOCRAT)(?!.*PEOPLE)(?!.*NORTH).*\\BKOREA(?!.*D.*P.*R)"))
REP.*CZECH|CZECH.*REP|CZECHIA|BOHEMIA
^^^^^^^^^^^^^^^^^^^^^