我有一个带有文本行的数据框,如下所示:
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)
我尝试通过使用“(”作为两列之间的分隔符来保留名称,但我认为 R 不喜欢我尝试使用括号作为分隔符...
任何建议将不胜感激。
最佳答案
对于像您这样更复杂的模式匹配,您可以使用 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+)
然后是一个空格,第四组只包含数字 $
字符串结尾 关于r - 将文本行分隔为数据框的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35397819/