在R中清理和拆分数据集

在R中清理和拆分数据集,r,regex,list,dataframe,split,R,Regex,List,Dataframe,Split,我有一个类似这样的数据帧(注意单词的长度一直在变化,关键是它是不可预测的)风险值是一个因素: 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 换句话说,我想去掉“()”和“[]”中的所有内容,包括括号本身以

我有一个类似这样的数据帧(注意单词的长度一直在变化,关键是它是不可预测的)<代码>风险值是一个因素:

                       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

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

我们可以在
base R
中执行此操作,方法是使用
sub
从'VAR'列中删除子字符串,并使用
read.table
读取
向量
,以创建两列
数据.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
数据
df1您可以使用正则表达式来捕获与AAA、BBB、CCC、DDD匹配的组。
基本上,编写一个与您的格式匹配的普通正则表达式:

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

[^ -]+[ -]+[^ -]+[ -]+\\([^ -]*\\)[ -]+\\[[^ -]*\\]
如果你不熟悉基本的正则表达式课程,请查阅

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

([^ -]+)[ -]+([^ -]+)[ -]+\\(([^ -]*)\\)[ -]+\\[([^ -]*)\\]
现在,我们可以简单地使用这个正则表达式来提取相关的组

来自package
stringr
的函数
str\u match
可用于提取捕获组。(我通常不建议使用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"