在R中,使用数据帧数据擦除字符串的部分

时间:2014-01-04 03:39:58

标签: string r vectorization substr stringr

我的数据框看起来像:

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

1 个答案:

答案 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"