【问题标题】:extracting data before a sign in R [duplicate]在R中签名之前提取数据[重复]
【发布时间】:2019-01-03 20:21:40
【问题描述】:

我需要提取符号之前的所有文本,在本例中为破折号。 我有这样的数据:

  text1 <- "Médicos-Otros"
  text2 <- "Disturbio-Escándalo"
  text3 <- "Accidente-Choque"

问题是我要提取的单词长度不同,所以我无法尝试其中一些

extract <- substring(text1, 1, n)

想要的结果是:

extract1 <- "Médicos"
extract2 <- "Disturbio"
extract3 <- "Accidente"

【问题讨论】:

标签: r regex


【解决方案1】:

你也可以使用strsplit

> sapply(strsplit(c(text1, text2, text3), "-"), "[[", 1)
[1] "Médicos"   "Disturbio" "Accidente"

考虑使用 stringr 包中的 str_extract 作为另一种选择

> library(stringr)
> str_extract(c(text1, text2, text3), "\\w+")
[1] "Médicos"   "Disturbio" "Accidente"

【讨论】:

    【解决方案2】:

    使用sub 完成这项工作:

    sub("(.*)-.*", "\\1", c(text1, text2, text3))
    # [1] "Médicos"   "Disturbio" "Accidente"
    

    在这里,我们将每个字符分为:破折号之前的内容 ((.*))、破折号本身以及破折号之后的内容 (.*)。然后将每个字符替换为第一部分 (\\1)。

    类似地你可以提取下半部分:

    sub(".*-(.*)", "\\1", c(text1, text2, text3))
    # [1] "Otros"     "Escándalo" "Choque"   
    

    【讨论】:

    • 谢谢。还有一件事,只是为了理解它是如何工作的:如果有很多破折号并且我特别需要一个破折号 ¿我怎样才能获得所需的文本部分?
    • @ArmandoGonzálezDíaz,例如提取第 5 部分(在第 4 个破折号之后),使用 sub("(.*?-){4}(.*?)($|-.*)", "\\2", txt),依此类推(只需将 {4} 更改为其他内容)。现在的模式完全不同,因为破折号的总数是未知的。如果您知道总共有四个破折号,那么第五部分将是sub(".*-.*-.*-.*-(.*)", "\\1", txt) ,如果我们继续以相同的方式进行,但显然一旦情况变得更复杂,就会有更简洁的方式。为了将来,请记住确保您的初始问题包含所有内容。
    【解决方案3】:

    你可以使用正则表达式:

    text1 <-  "Médicos-Otros"
    text2 <-  "Disturbio-Escándalo"
    text3 <-  "Accidente-Choque"
    
    extract1 <- gsub("\\-.*", "", text1)
    extract2 <- gsub("\\-.*", "", text2)
    extract3 <- gsub("\\-.*", "", text3)
    

    这意味着匹配破折号(“-”)之后的所有内容(包括)并替换为任何内容“”。

    【讨论】:

    • 谢谢。现在我需要提取文本的第二部分¿我该怎么做?
    • @ArmandoGonzálezDíaz:如果您对每个字符串的两个部分都感兴趣,但将它们分开,则最好使用 Jilbers strsplit() 方法。例如:do.call(rbind, strsplit(c(text1, text2, text3), "-"))
    【解决方案4】:

    使用正则表达式进行积极预测

    sapply(c(text1, text2, text3), 
      function(x)
        regmatches(x, regexpr(".*(?=-)", x, perl=TRUE))
    )
    #      Médicos-Otros Disturbio-Escándalo    Accidente-Choque 
    #          "Médicos"         "Disturbio"         "Accidente" 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-07
      • 2023-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多