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

标签 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)

我尝试通过使用“(”作为两列之间的分隔符来保留名称,但我认为 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/

    相关文章:

    r - 将两个向量与 'or' 合并

    java - 在 Java 中解析字符串

    parsing - 开发一个简单的解析器

    parsing - LL(1) S → a | 的解析表巴| C

    r - 在 R 中使用 ifelse 语句

    r - 在大 data.table 中操作字符串的最佳方法

    python - 通过在 groupby 之后删除 nan 来合并 DataFrame 中的行

    python - 如何在不删除所有数据的情况下将列表转换为数据框?

    python - 使用数据帧数据调用函数会出错(无法将系列转换为 <class 'float' >)

    r - 为什么矩阵到栅格显示旋转?