【问题标题】:Split string with repeated delimiters使用重复分隔符拆分字符串
【发布时间】:2020-01-07 16:03:58
【问题描述】:

我在 R 中有一个字符串,格式如下:

example <- c("namei1 namej1, surname1, name2, surnamei2 surnamej2, name3, surname3")

我希望获得两列:

namei1 namej1   | surname1
name2           | surnamei2 surnamej2
name3           | surname3

我尝试使用字符串拆分:

example <- c("namei1 namej1, surname1, name2, surnamei2 surnamej2, name3, surname3")
pattern <- "\\,+[[:space:]]"
str_split(example, pattern)

但是,我从这里卡住了……

【问题讨论】:

    标签: r regex string strsplit


    【解决方案1】:

    我们可以在,后跟零个或多个空格(\\s*)分割字符串,然后根据'name'字符串和split的出现创建一个分组变量vector(v1 ) 变成vectors 的list,rbind thelistelements and convert it to adata.frame`

    v1 <- strsplit(example, ",\\s*")[[1]]
    setNames(do.call(rbind.data.frame, split(v1, cumsum(grepl('\\bname',
           v1)))), paste0("V", 1:2))
    #       V1                  V2
    #1 namei1 namej1            surname1
    #2         name2 surnamei2 surnamej2
    #3         name3            surname3
    

    或者另一个选项是scan 并将其转换为两列matrix

    as.data.frame( matrix(trimws(scan(text = example, sep=",",
          what = "", quiet = TRUE)), byrow = TRUE, ncol = 2))
    #       V1                  V2
    #1 namei1 namej1            surname1
    #2         name2 surnamei2 surnamej2
    #3         name3            surname3
    

    或者另一个选项是gsub,我们将,后跟空格和'name'字符串替换为\n和'name'并使用它。read.csv基于分隔符,进行拆分

    read.csv(text = gsub(", name", "\nname", example), header= FALSE)
    #         V1                   V2
    #1 namei1 namej1             surname1
    #2         name2  surnamei2 surnamej2
    #3         name3             surname3
    

    【讨论】:

    • 如果你跳过trimws会发生什么?
    • @M- 问题是scan sep 采用单个字符。我可以包括strip.white = TRUE 并避免trimws 尽管scan(text = example, sep=",", what = "", quiet = TRUE, strip.white = TRUE)。我想如果我使用trimws,它可以变得更紧凑。没有别的
    【解决方案2】:
    data.frame(split(unlist(strsplit(example, ", ")), c(0, 1)))
    #             X0                  X1
    #1 namei1 namej1            surname1
    #2         name2 surnamei2 surnamej2
    #3         name3            surname3
    

    【讨论】:

      【解决方案3】:
      read.csv(text = gsub("([^,]+,[^,]+),", "\\1\n", example), 
               header = FALSE, stringsAsFactors = FALSE)
      
      #              V1                   V2
      # 1 namei1 namej1             surname1
      # 2         name2  surnamei2 surnamej2
      # 3         name3             surname3
      

      【讨论】:

      • 你能解释一下正则表达式吗?
      • @camille 它会成对查找逗号并将第二个逗号(\\1 保留第一个逗号)替换为\n,即newline。 read.csv 使用逗号作为列分隔符,\n 将被解释为新行。我也可以使用(,[^,]*),。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      相关资源
      最近更新 更多