如何根据特定位置删除字符串中的字符/数字?

时间:2018-09-24 15:31:04

标签: r string

我的ID写为

PSA20001_USDa1_d0001
PSA20001_USDa2_d0002
PSA20001_USDa3_d0003

我想只删除下划线开头的中间部分

_USDa1_

我尝试了

str_replace(data$id, pattern = "_\\w\\_", replacement = "")

但是它不起作用。有什么帮助吗?

2 个答案:

答案 0 :(得分:1)

我们可以使用sub来匹配_,然后匹配不是_的一个或多个字符,然后再匹配_,用空白({{1 }})

""

或者,如果它基于位置,那么也可以使用sub("_[^_]+_", "", df1$id) #[1] "PSA20001d0001" "PSA20001d0002" "PSA20001d0003"

substr

或使用with(df1, paste0(substr(id, 1, 8), substring(id, 16)))

str_remove

如果我们希望在library(stringr) str_remove(df1$id, "_[^_]+_") 流程中使用它

tidyverse

数据

library(dplyr)
df1 %>%
   mutate(id = str_remove(id, "_[^_]+_"))
#            id
#1 PSA20001d0001
#2 PSA20001d0002
#3 PSA20001d0003

答案 1 :(得分:1)

使用sub

data$id <- sub("_.+_", "", data$id)

使用str_replacedplyr

library(dplyr)
library(stringr)

data %>%
  mutate(id = str_replace(id, pattern = "_.+?_", replacement = ""))

输出:

             id
1 PSA20001d0001
2 PSA20001d0002
3 PSA20001d0003

注释:

  1. _与文字下划线匹配

  2. .+匹配任何字符一次或多次

  3. _再次匹配文字下划线

正如Tim Biegeleisen在评论中指出的那样,如果字符串中有更多的下划线,则使用.+?而不是.+

使正则表达式变得懒惰可能更安全。

数据:

data <- structure(list(id = c("PSA20001d0001", "PSA20001d0002", "PSA20001d0003"
)), .Names = "id", row.names = c(NA, -3L), class = "data.frame")