替换指定位置后的字符串中的所有元素

时间:2016-05-09 22:30:07

标签: regex r string

我想在字符串之间变化的指定位置之后替换字符串中的所有元素。理想情况下,解决方案会在基础regex中使用R

这是一个有效的例子和期望的结果:

my.last.position <- c(5, 7, 3, NA, 10)

my.data <- read.table(text='
                         my.string
                         .1.222.2.2
                         ..1..1..2.
                         1.1.2.2...
                         .222.232..
                         ..1..1...1
', header=TRUE, stringsAsFactors = FALSE)
my.data

desired.result <- read.table(text='
                         my.string
                         .1.22.....
                         ..1..1....
                         1.1.......
                         .222.232..
                         ..1..1...1
', header=TRUE, stringsAsFactors = FALSE)
desired.result

向量my.last.position指定要在每个字符串中保留的最后位置。 data.frame desired.result包含所需的结果。

感谢您的任何建议。对不起,如果这是重复的。

2 个答案:

答案 0 :(得分:2)

希望有人能提出一个比这更优雅的解决方案,但这里有:

mapply(
    function(s,i) paste(collapse='',if (is.na(i)) s else c(s[seq_len(i)],rep('.',length(s)-i))),
    strsplit(my.data$my.string,''),
    my.last.position
);
## [1] ".1.22....." "..1..1...." "1.1......." ".222.232.." "..1..1...1"

答案 1 :(得分:1)

这是另一种方法。不确定它是否更优雅:

# as in the example output, any NAs are treated as do not mess with this
# vector element
my.last.position.NoNA <- ifelse(is.na(my.last.position),
                                nchar(my.data$my.string), my.last.position)

# perform the replacement
paste0(substr(my.data$my.string, 1, my.last.position.NoNA), 
  sapply(1:nrow(my.data), function(i) paste0(rep(".", 
                length=(nchar(my.data$my.string[i])-my.last.position[i])),
                collapse="")))