【问题标题】:How to extract the row with specific pattern from tabular data in R?如何从 R 中的表格数据中提取具有特定模式的行?
【发布时间】:2018-04-13 19:34:17
【问题描述】:

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

这是最小的可重现示例:

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,...,...,...,...,...,...,)))

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

更新

在原始数据中,缺失值用...填充,我希望过滤后的data.frame将相应的...替换为NANNULL

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

【问题讨论】:

  • 答案应该对您问题的本质有所帮助,但请注意数据示例不起作用。所有的引号都不见了。当dec01 之类的东西变成类似日期的东西Dec-01 时,您的一些记录可能会被弄乱(通过Excel?)。所以你需要以某种方式照顾它。
  • @ngm 感谢您的帮助。

标签: r regex dataframe


【解决方案1】:

编写正则表达式的一种方法是: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 中基本正则表达式用法的摘要,您可以随时通过在控制台中输入 ?regex 来访问。

【讨论】:

    【解决方案2】:

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

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

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

    从数据框中提取:

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

    【讨论】:

      猜你喜欢
      • 2015-12-12
      • 1970-01-01
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 2020-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多