在R

时间:2017-04-04 15:08:04

标签: r regex list dataframe split

我有一个看起来像这样的数据框(请注意,单词的长度保持不变,重点是它不可预测)。 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

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

这是一个非常广泛的正则表达式,因为不确定你的&#34; AAA&#34;代表:

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

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

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

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

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

str_match中的函数stringr可用于提取捕获组。 (我一般建议不要使用R base regex实用程序,因为我发现它们的语法非常不一致......)

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"