我有一个看起来像这样的数据框(请注意,单词的长度保持不变,重点是它不可预测)。 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
换句话说,我想摆脱"()"中的所有内容。和" []",包括括号本身,以及所有破折号,并将提醒分成两个变量,如图所示。任何帮助,将不胜感激!
答案 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"