我的数据框中包含如下所示的文本行:
ANTALYA (GB) ch. 1960
SHOOTIN WAR (USA) ch. 1998
LORD AT WAR (ARG) ch. 1980
全部大写是名称,然后是(),颜色缩写,年份的位置。名称可以是多个单词。 我想将这个单个文本块分成每个组件:名称,位置,颜色,年份。 我已经和它斗争了好几天了,我所拥有的最好的工作解决方案是将每个单词放在不同的列中,但它只有在名称都是一定长度时才有效...对于我正在做的事情数据,我可以在这种形式下使用它,但它看起来不太好,你知道吗?
sepdf <- df %>%
separate(pedigree, into=c("Name1", "Name2", "Loc", "Col", "Year"),
sep=" ", merge=TRUE)
我尝试使用“(”作为2列之间的分隔符来保持名称,但我不认为R喜欢我试图使用括号作为分隔符...
任何建议都会非常值得赞赏。
答案 0 :(得分:4)
对于像你这样更复杂的模式匹配,你可以使用tidyr的extract
函数,它可以让你创建正则表达式捕获组。每个组都在一组括号内(()
):
library(tidyr)
extract(df, pedigree, into = c("Name", "Loc", "Col", "Year"),
regex = "^([A-Z ]+) \\((.*)\\) ([a-z]+\\.) (\\d+)$")
Name Loc Col Year
1 ANTALYA GB ch. 1960
2 SHOOTIN WAR USA ch. 1998
3 LORD AT WAR ARG ch. 1980
我在这里使用的正则表达式是:
^
字符串的开头([A-Z ]+)
第一组包含多个大写字母和空格\\(
然后有一个空格和一个左括号(用\ _进行转义)(.*)
第二组是括号中的任何内容\\)
后跟一个右括号和一个空格([a-z]+\\.)
第三组包含小写字母和一个点(\\d+)
然后是空格,第四组只包含数字$
字符串结尾