我的数据框看起来像:
'data.frame': 81 obs. of 2 variables:
$ start: int 232 10697 10965 12279 15647 16897 17033 17612 17719 17983 ...
$ end : int 243 10702 10970 12284 15652 16902 17038 17617 17724 17988 ...
我有一个字符串,其中包含我要在那些起始/结束偏移对处擦除的内容。因此,无论字节偏移量232和234之间是什么,我都想“擦除它”并折叠空间。我发现我想要向后处理字符串,所以如果我在结尾处修改它,那么靠近开头的偏移量仍然有效。我到目前为止的代码是:
for (i in nrow(cutpoints):1) {
row = cutpoints[i,]
substr(sc, row$start, row$end) <- " "
}
但是当我之后打印出sc时,它只删除了我想删除的每个子字符串的第一个字符。有没有人知道我做错了什么?此外,这可以进行矢量化吗?
更新 - 我尝试使用stringr的str_sub:
> hw <- "Hadley Wickham"
> cuts <- data.frame(start=c(1,8), end=c(6,14))
> str_sub(hw, rev(cuts$start), rev(cuts$end)) <- " "
> hw
[1] "Hadley " " Wickham"
所以,显然我不明白我在R中用字符串处理做什么。
答案 0 :(得分:1)
使用范围向量来保持而不是切割范围更容易。通过翻转开始和结束并稍微调整,这很容易做到:
hw <- "Hadley WickhamPLUSENDING"
cuts <- data.frame(start=c(1,8), end=c(6,14))
keeps <- data.frame(start=c(1, cuts$end+1), end=c(cuts$start-1, nchar(hw)))
keeps
# start end
# 1 1 0
# 2 7 7
# 3 15 24
在结束后开始的子字符串将不会返回任何字符,因此它们不是我们方法的问题。
您可以使用apply
来矢量化保持每个开始/结束对之间的所有操作:
pieces <- apply(keeps, 1, function(x) substr(hw, x[1], x[2]))
pieces
# [1] "" " " "PLUSENDING"
paste(pieces, collapse="")
# [1] " PLUSENDING"