如何从R中的表格数据中提取具有特定模式的行?

时间:2018-04-13 19:34:18

标签: r regex dataframe

我在大excel文件中有德国人口数据集,我只对德国地区的NUTS3级人口感兴趣,这是eurostat提供的进一步的具体文件:NUTS classification。但是,基于NUTS3规范,我打算提取具有特定模式的行。特别是,我需要提取country_code de之类的行,并计算任意三个数字或计算数字和字符的任意三种组合。

这是可重复性最小的例子:

structure(list(code=c(de1,de11,de111,de112,de11a,de11b,de12,de121,de27c,de3,
                  de4,de41,de411,de94h,dea,dea1,dea11,dea12,dec,Dec-01,Dec-06,
                  dee,dee01,dee02,dee0a,dee0b,dee0c),
           region_name=c(Baden-Württemberg,Stuttgart,Stuttgart-Stadtkreis,Böblingen,
                         Schwäbisch Hall,Main-Tauber-Kreis,Karlsruhe,Baden-Baden- Stadtkreis,
                         Unterallgäu,Berlin,Brandenburg,Brandenburg - Nordost,
                         Frankfurt (Oder)- Kreisfreie Stadt,Wittmund,Nordrhein-Westfalen,
                         Düsseldorf,Düsseldorf- Kreisfreie Stadt,Duisburg- Kreisfreie Stadt,
                         Saarland,Saarbrücken- Stadtverband,Sankt Wendel,Sachsen-Anhalt,
                         Dessau-Roßlau- Kreisfreie Stadt,Halle (Saale)- Kreisfreie Stadt,
                         Mansfeld-Südharz,Saalekreis,Salzland),
           pop_1980=c(2981,9131,3438,576,149,120,2368,49,114,...,...,...,...,53,16905,5178,589,
                      555,1063,364,90,...,...,...,...,...,...),
           pop_1981=c(1981,9172,3450,576,149,120,2380,49,114,...,...,...,...,53,16910,5170,585,
                      553,1060,363,90,...,...,...,...,...,...,)))

这是我想要的输出(只是手动修剪):

enter image description here

更新

在原始数据中,缺失值填充了...,我希望过滤的数据。相应的...框架将替换为NANNULL

对于country_code列中的相应模式,如何提取de +计算三个数字或数字和字符的行?我怎样才能轻松地在R中实现这一点?有什么想法吗?

2 个答案:

答案 0 :(得分:3)

编写正则表达式的一种方法是:de[[:alnum:]]{3}。这意味着" d后跟e,后跟任意字母或数字正好3。关于[[:alnum:]]的好处是它在非英语字符集方面更加强大。

使用正则表达式的方法有很多种。一些可能性(比如您的数据框称为d_f):

# Base R
d_f[grepl("de[[:alnum:]]{3}", d_f$code,]

# dplyr
library(dplyr)
d_f %>%
  filter(grepl("de[[:alnum:]]{3}", code))

R中有一个很好的R基本正则表达式使用摘要,您可以通过在控制台中键入?regex来随时访问它。

答案 1 :(得分:2)

使用此代码查找符合条件的行号:

/usr/libexec/PlistBuddy -c "Print :DevicePreferences" ~/Library/Preferences/com.apple.iphonesimulator.plist | perl -lne 'print $1 if /^    (\S*) =/' | while read -r a; do /usr/libexec/PlistBuddy -c "Set :DevicePreferences:$a:ConnectHardwareKeyboard
false" ~/Library/Preferences/com.apple.iphonesimulator.plist || /usr/libexec/PlistBuddy -c  "Add :DevicePreferences:$a:ConnectHardwareKeyboard
bool false" ~/Library/Preferences/com.apple.iphonesimulator.plist; done

这将查找带有“de”的字符串,后跟3个字母或数字的组合。

从数据框中提取:

 grep( "de[a-zA-Z0-9]{3}", df$code)