R中多个符号之前的gsub字符串

时间:2019-05-10 20:15:36

标签: r gsub

我正在尝试在R中的列中的多个符号之前对字符串进行gsub操作。让我用一个示例进行解释

data <- data.frame(c("1_a-b","2: b-c","3_c-d"))
colnames(data) <- "ABC"

我希望最终的数据集看起来像这样:

data <- data.frame(c("a-b","b-c","c-d"))
colnames(data) <- "ABC"

我正在这样做:

if(any(grepl(":|_", data$ABC))){
      data$ABC <- gsub(".*_", "", data$ABC)
    } 

我尝试使用管道“ |”添加另一个条件,例如:

if(any(grepl(":|_", data$ABC))){
      data$ABC <- gsub(".*_"|".*:", "", data$ABC)
    } 

但是它不起作用。有没有办法一步一步做到这一点。另外,我必须检查列中是否包含这些符号,从而检查grepl。

2 个答案:

答案 0 :(得分:1)

如果您需要删除最后一个_:,则可以使用以下正则表达式:

sub(".*[_:]\\s*", "", data$ABC)

或者,如果您需要删除最多前_:

sub(".*?[_:]\\s*", "", data$ABC)

模式详细信息

  • .*?-任意0个以上的字符,并且尽可能少(.*尽可能匹配0个或多个字符)
  • [_:]-一个_:
  • \s*-超过0个空格。

请参见regex demoR demo

data <- data.frame(c("1_a-b","2: b-c","3_c-d"))
colnames(data) <- "ABC"
if(any(grepl(":|_", data$ABC))){
   data$ABC <- sub(".*[_:]\\s*", "", data$ABC)
} 

data的输出:

  ABC
1 a-b
2 b-c
3 c-d

答案 1 :(得分:0)

使用stringr包如何处理?

library(stringr)
df %>% 
  mutate(
    ABC = as.character(ABC),
    new = if_else(
      str_detect(ABC, "\\w\\-\\w"),
      str_extract(ABC, "\\w\\-\\w"),
      ABC
    )
  )

     ABC new
1  1_a-b a-b
2 2: b-c b-c
3  3_c-d c-d

已更改为包含if-else语句-错过了您有兴趣检查该序列的信息。