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

时间:2016-02-14 20:49:52

标签: r parsing dataframe tidyr

我的数据框中包含如下所示的文本行:

         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喜欢我试图使用括号作为分隔符...

任何建议都会非常值得赞赏。

1 个答案:

答案 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+)然后是空格,第四组只包含数字
  • $字符串结尾