我的ID写为
PSA20001_USDa1_d0001
PSA20001_USDa2_d0002
PSA20001_USDa3_d0003
我想只删除下划线开头的中间部分
_USDa1_
我尝试了
str_replace(data$id, pattern = "_\\w\\_", replacement = "")
但是它不起作用。有什么帮助吗?
答案 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_replace
和dplyr
:
library(dplyr)
library(stringr)
data %>%
mutate(id = str_replace(id, pattern = "_.+?_", replacement = ""))
输出:
id
1 PSA20001d0001
2 PSA20001d0002
3 PSA20001d0003
注释:
_
与文字下划线匹配
.+
匹配任何字符一次或多次
_
再次匹配文字下划线
正如Tim Biegeleisen在评论中指出的那样,如果字符串中有更多的下划线,则使用.+?
而不是.+
数据:
data <- structure(list(id = c("PSA20001d0001", "PSA20001d0002", "PSA20001d0003"
)), .Names = "id", row.names = c(NA, -3L), class = "data.frame")