0

我有一个看起来像这样的数据框:

'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 中的字符串处理做什么。

4

1 回答 1

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"
于 2014-01-04T04:09:54.477 回答