基于正则表达式的替换

Substitute based on regex

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]])

如有任何帮助,我们将不胜感激!

有几种方法可以做到这一点,但我喜欢使用 {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       

这是一个基本的 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"

编辑

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

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

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

使用@Rory S 的数据。

sub_function <- function(x) {
  readr::parse_number(x)
}

sub_function(df$targetcol)
#[1] 4658 5847 4958