【问题标题】:Substitute based on regex [duplicate]基于正则表达式的替换[重复]
【发布时间】:2021-09-04 06:14:24
【问题描述】:

对 R 来说相对较新,在应用基于正则表达式的替换方面需要帮助。 我在一列中有一个数据框,其中有一列数字(我感兴趣的值),后跟一串各种字符。 示例:

4623(randomcharacters)

我需要删除初始数字之后的所有内容才能继续使用这些值。我的想法是使用 gsub 通过积极的后视来删除非数字字符。 我的代码是:

sub_function <- function() {
  gsub("?<=[[:digit:]].", " ", fixed = T)
}


data_frame$`x` <- data_known$`x` %>% 
  sapply(sub_function)

然后我得到错误:

Error in FUN(X[[i]], ...) : unused argument (X[[i]])

任何帮助将不胜感激!

【问题讨论】:

  • 该函数没有参数,那么gsub 是替代但从什么?在您的代码中,gsub("?&lt;=[[:digit:]].", " ", x, fixed = T) 中没有 x。另外,为什么是管道?我会在重新定义函数sub_function &lt;- function(x)之后做sub_function(data_known$x)

标签: r regex string regex-lookarounds


【解决方案1】:

有几种方法可以做到这一点,但我喜欢使用 {tidyverse} 中的函数:

library(tidyverse)

# Create some dummy data
df <- tibble(targetcol = c("4658(randomcharacters)", "5847(randomcharacters)", "4958(randomcharacters)"))

df <- mutate(df, just_digits = str_extract(targetcol, pattern = "^[[:digit:]]+"))

输出(df的内容):

  targetcol              just_digits
  <chr>                  <chr>      
1 4658(randomcharacters) 4658       
2 5847(randomcharacters) 5847       
3 4958(randomcharacters) 4958       

【讨论】:

    【解决方案2】:

    这是一个基本的 R 函数。
    它使用sub,而不是gsub,因为只有一个替换。无需往后看,元字符^ 标记了字符串的开头,后面跟着一个可选的减号,后面跟着至少一个数字。其他所有内容都被丢弃。

    sub_function <- function(x){
      sub("(^-*[[:digit:]]+).*", "\\1", x)
    }
    
    data <- data.frame(x = c("4623(randomcharacters)", "-4623(randomcharacters)"))
    
    sub_function(data$x)
    #[1] "4623"  "-4623"
    

    编辑

    通过这个简单的修改,函数返回一个数值向量。

    sub_function <- function(x){
      y <- sub("(^-*[[:digit:]]+).*", "\\1", x)
      as.numeric(y)
    }
    

    【讨论】:

    • 这就像一个魅力,谢谢!如果也有负值,我可以在正则表达式前面添加第二个带有“减号”的函数吗?
    • @Nuramon 很高兴它有帮助。还有一件事,当您说要“继续使用值” 时,这是否意味着您希望函数的输出是数字,而不是字符串?
    • 我只是在函数之后将它们转换为数字,所以我什至没有想到函数本身会这样做,但感谢您的关注。
    • @Nuramon 有y &lt;- sub(.)然后在函数中返回as.numeric(y)可能会使函数后面的代码更清晰。在一个函数调用中完成所有工作。我将使用此版本进行编辑。
    【解决方案3】:

    如果您总是想从数据中提取数字,您可以使用readr 中的parse_number。默认情况下它也会以数字形式返回数据。

    使用@Rory S 的数据。

    sub_function <- function(x) {
      readr::parse_number(x)
    }
    
    sub_function(df$targetcol)
    #[1] 4658 5847 4958
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      • 2014-08-30
      • 1970-01-01
      相关资源
      最近更新 更多