【问题标题】:Cleaning and splitting a dataset in R在 R 中清理和拆分数据集
【发布时间】:2017-04-04 15:08:04
【问题描述】:

我有一个看起来像这样的数据框(请注意,单词的长度不断变化,关键是它是不可预测的)。 VAR 是一个因素:

                       VAR
1     AAA - BB (CC) [DDDD]
2 A - BBB - (CCCC) - [DDD]
3  AA - B - (CCC) - [DDDD]

我想把它转换成这个:

    X      Y
1 AAA     BB
2   A    BBB
3  AA      B

换句话说,我想去掉 "()" 和 "[]" 中的所有内容,包括括号本身以及所有破折号,并将提醒拆分为两个变量,如图所示。任何帮助,将不胜感激!

【问题讨论】:

    标签: r regex list dataframe split


    【解决方案1】:

    您可以使用正则表达式与匹配您的 AAA、BBB、CCC、DDD 的捕获组。 基本上,编写一个与您的格式匹配的普通正则表达式:

    这是一个非常广泛的正则表达式,因为不确定您的“AAA”代表什么:

    [^ -]+[ -]+[^ -]+[ -]+\\([^ -]*\\)[ -]+\\[[^ -]*\\]
    

    如果您不熟悉,请查阅基本的正则表达式课程。

    然后在要提取的内容周围添加括号;这会创建捕获组。这里我在匹配 AAA、BBB、CCC、DDD 的位周围添加了括号:

    ([^ -]+)[ -]+([^ -]+)[ -]+\\(([^ -]*)\\)[ -]+\\[([^ -]*)\\]
    

    现在,我们可以简单地使用这个正则表达式来提取相关组。

    stringr 包中的函数str_match 可用于提取捕获组。 (我通常建议不要使用 R 基础正则表达式实用程序,因为我发现它们的语法非常不一致......)

    VAR <- c("AAA - BB (CC) [DDDD]", 
             "A - BBB - (CCCC) - [DDD]",
             "AA - B - (CCC) - [DDDD]")
    
    library(stringr)
    
    str_match(VAR, "([^ -]+)[ -]+([^ -]+)[ -]+\\(([^ -]*)\\)[ -]+\\[([^ -]*)\\]")
    

    结果:

         [,1]                       [,2]  [,3]  [,4]   [,5]  
    [1,] "AAA - BB (CC) [DDDD]"     "AAA" "BB"  "CC"   "DDDD"
    [2,] "A - BBB - (CCCC) - [DDD]" "A"   "BBB" "CCCC" "DDD" 
    [3,] "AA - B - (CCC) - [DDDD]"  "AA"  "B"   "CCC"  "DDDD"
    

    【讨论】:

      【解决方案2】:

      我们可以在base R 中执行此操作,方法是使用sub 从“VAR”列中删除子字符串,并使用read.table 读取vector 以创建一个两列data.frame

      res <-  read.table(text=gsub("\\s+", "", sub("\\s*-*\\s+\\(.*", "", df1$VAR)), 
                    sep="-", col.names = c("x", "y"), stringsAsFactors=FALSE)
      res
      #    x   y
      #1 AAA  BB
      #2   A BBB
      #3  AA   B
      

      或者我们可以使用tidyverse

      library(tidyr)
      extract(df1, VAR, into = c("x", "y"), "^(\\w+)\\W+(\\w+).*")
      #    x   y
      #1 AAA  BB
      #2   A BBB
      #3  AA   B
      

      数据

       df1 <- structure(list(VAR = c("AAA - BB (CC) [DDDD]", "A - BBB - (CCCC) - [DDD]", 
       "AA - B - (CCC) - [DDDD]")), .Names = "VAR", class = "data.frame", row.names = c("1", 
      "2", "3"))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多