在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的位周围添加了括号:
([^ -]+)[ -]+([^ -]+)[ -]+\\(([^ -]*)\\)[ -]+\\[([^ -]*)\\]
现在,我们可以简单地使用这个正则表达式来提取相关的组
来自packagestringr
的函数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"