【问题标题】:In R, how can I extract all the text up to the left parenthesis?在 R 中,如何提取到左括号的所有文本?
【发布时间】:2020-09-14 17:53:56
【问题描述】:

在我的数据框的获胜者列中,我想删除从左括号开始的所有文本。

搜索stackoverflow.com,我找到了this response,并在我的代码中应用了它的stringr 解决方案,但它不起作用。我的代码没有改变我的输入。

输入:

Year    Lg  Winner                  Team
1956    NL  Don Newcombe (1 | MVP)  Brooklyn (1)
1957    NL  Warren Spahn (1 | HOF | ASG)    Milwaukee (1)
1958    AL  Bob Turley (1 | ASG)    New York (1)

这是我希望输出的样子:

Year    Lg  Winner                  Team
1956    NL  Don Newcombe            Brooklyn (1)
1957    NL  Warren Spahn            Milwaukee (1)
1958    AL  Bob Turley              New York (1)

输入(dfx):

structure(list(Year = 1956:1958, Lg = structure(c(2L, 2L, 1L), .Label = c("AL", 
"NL"), class = "factor"), Winner = structure(c(2L, 3L, 1L), .Label = c("Bob Turley (1 | ASG)", 
"Don Newcombe (1 | MVP)", "Warren Spahn (1 | HOF | ASG)"
), class = "factor"), Team = structure(1:3, .Label = c("Brooklyn (1)", 
"Milwaukee (1)", "New York (1)"), class = "factor")), class = "data.frame", row.names = c(NA, 
-3L))

代码:

library(stringr)
dfnoparens <- dfx
str_replace(dfnoparens$Winner, " \\(.*\\)", "")
head(dfnoparens)

【问题讨论】:

  • m &lt;- regexpr('^[^\\(]*', dfnoparens$Winner);regmatches(dfnoparens$Winner, m).
  • 你需要分配它,即dfnoparens$Winner &lt;-str_replace(dfnoparens$Winner, " \\(.*\\)", ""),否则不需要包,一个简单的sub就可以了
  • 在 Base R 中,您可以使用 sub("\\(.*", "", dfx$Winner)
  • 当我使用下面的代码分配它时,结果没有改变: library(stringr) dfnoparens
  • 你必须把它分配到正确的地方@Metsfan dfnoparens 只是你原来的dfx 的副本尝试dfnoparens$newwinner &lt;- str_replace(dfnoparens$Winner, " \(.*\)", "") 然后head(dfnoparens)

标签: r string replace stringr


【解决方案1】:

用问题中的测试数据(仅相关列)。

x <- c('Don Newcombe (1 | MVP)', 'Warren Spahn (1 | HOF | ASG)', 'Bob Turley (1 | ASG)')

使用regexpr/regmatches

m <- regexpr('^[^\\(]*', x)
y <- regmatches(x, m)
y
#[1] "Don Newcombe " "Warren Spahn " "Bob Turley "

此输出字符串在左括号前仍有空格,如果需要,请立即将其删除。

trimws(y)
#[1] "Don Newcombe" "Warren Spahn" "Bob Turley"

【讨论】:

    【解决方案2】:

    我们可以使用trimwswhitespace

     trimws(x, whitespace = "\\s*\\(.*")
     #[1] "Don Newcombe" "Warren Spahn" "Bob Turley"  
    

    数据

    x <- c('Don Newcombe (1 | MVP)', 'Warren Spahn (1 | HOF | ASG)', 'Bob Turley (1 | ASG)')
    

    【讨论】:

      【解决方案3】:

      使用stringr 库中的str_extract

      df$Winner <- str_extract(df$Winner, ".*(?=\\s\\(\\d)")
      

      此解决方案在(?=...) 中使用正向前瞻;前瞻可以解释为“匹配任何出现在空格 (\\s) 后跟左圆括号 (\\() 后跟数字 (\\d) 之前的任何内容 (.*)”。

      结果:

      df
        Year Lg       Winner          Team
      1 1956 NL Don Newcombe  Brooklyn (1)
      2 1957 NL Warren Spahn Milwaukee (1)
      3 1958 AL   Bob Turley  New York (1)
      

      【讨论】:

        【解决方案4】:
        df <- structure(list(Year = 1956:1958, 
                             Lg = structure(c(2L, 2L, 1L), .Label = c("AL", "NL"), class = "factor"), 
                             Winner = structure(c(2L, 3L, 1L), 
                                                .Label = c("Bob Turley (1 | ASG)", "Don Newcombe (1 | MVP)", 
                                                           "Warren Spahn (1 | HOF | ASG)"), class = "factor"),
                             Team = structure(1:3, .Label = c("Brooklyn (1)", "Milwaukee (1)", "New York (1)"), 
                                              class = "factor")), class = "data.frame", row.names = c(NA,-3L))
        

        这是strsplit 解决方案。

        df$Winner <- unlist(lapply(strsplit(as.character(df$Winner)," (",fixed=TRUE), `[[`, 1))
        df
          Year Lg       Winner          Team
        1 1956 NL Don Newcombe  Brooklyn (1)
        2 1957 NL Warren Spahn Milwaukee (1)
        3 1958 AL   Bob Turley  New York (1)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-05-11
          • 1970-01-01
          • 2012-01-26
          • 2021-11-24
          • 2021-09-01
          • 2010-09-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多