我正在尝试在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。
答案 0 :(得分:1)
如果您需要删除最后一个_
或:
,则可以使用以下正则表达式:
sub(".*[_:]\\s*", "", data$ABC)
或者,如果您需要删除最多前_
或:
:
sub(".*?[_:]\\s*", "", data$ABC)
模式详细信息:
.*?
-任意0个以上的字符,并且尽可能少(.*
尽可能匹配0个或多个字符)[_:]
-一个_
或:
\s*
-超过0个空格。请参见regex demo和R 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语句-错过了您有兴趣检查该序列的信息。