将文本行分隔为数据框的列

Separating line of text into columns of a dataframe

我有一个数据框,其中的文本行如下所示:

         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 ]+)第一组包含多个大写字母和spaces
  • \( 然后有一个 space 和一个左括号(用 \ 转义)
  • (.*)第二组是括号内的任何内容
  • \) 后跟右括号和 space
  • ([a-z]+\.)第三组包含小写字母和一个点
  • (\d+) 然后是 space 第四组只包含数字
  • $ 字符串结尾