如何在r中的列中替换字符串的第n个字符

时间:2015-08-01 12:02:38

标签: regex r string dataframe gsub

我的输入是

a<-c("aa_bbb_cc_ddd","ee_fff_gg_hhh")
b<-c("a","b")
df<-data.frame(cbind(a,b))

我希望我的输出

a<-c("aa_bbb-cc_ddd","ee_fff-gg_hhh")
b<-c("a","b")
df<-data.frame(cbind(a,b))

请帮助

3 个答案:

答案 0 :(得分:5)

如果事情与您显示的一致,并且您想要替换第7个字符,那么substring可能是一个很好的方法,但您通过使用data.frame包裹而不使用{{{{{}来制作列字符1}}。您需要先创建列字符:

stringsAsFactors = FALSE

答案 1 :(得分:4)

您可以使用sub,

sub("^([^_]*_[^_]*)_", "\\1-",df$a)

示例:

> a<-c("aa_bbb_cc_ddd","ee_fff_gg_hhh")
> b<-c("a","b")
> df<-data.frame(cbind(a,b))
> df
              a b
1 aa_bbb_cc_ddd a
2 ee_fff_gg_hhh b
> df$a <- sub("^([^_]*_[^_]*)_", "\\1-",df$a)
> df
              a b
1 aa_bbb-cc_ddd a
2 ee_fff-gg_hhh b

答案 2 :(得分:3)

以下是用_替换 n -次出现的一般方法。

n <- 2

# create regex pattern based on n
pat <- paste0("^((?:.*?_){", n - 1, "}.*?)_")
# [1] "^((?:.*?_){1}.*?)_"

# replace character
sub("^((?:.*?_){1}.*?)_", "\\1-", df$a, perl = TRUE)
# [1] "aa_bbb-cc_ddd" "ee_fff-gg_hhh"