我正在寻找一种方法来删除 R 中字符串中某些位置的字符。例如,如果我们有一个 string "1,2,1,1,2,1,1,1,1,2,1,1"
,我想删除第三、第四、第七和第八个位置。该操作将使字符串:"1,1,2,1,1,1,1,2,1,1"
。
不幸的是,使用 strsplit 将字符串分解为列表不是一种选择,因为我正在使用的字符串长度超过 100 万个字符。考虑到我有大约 2,500 个字符串,这需要相当长的时间。
或者,找到一种用空字符串替换字符的方法""
可以达到同样的目的——我认为。考虑到这一思路,我发现了这篇 StackOverflow 帖子:
不幸的是,建议的解决方案很难有效地概括,对于要删除的 2000 个位置的列表,每个输入字符串大约需要 60 秒:
subchar2 = function(inputstring, pos){
string = ""
memory = 0
for(num in pos){
string = paste(string, substr(inputstring, (memory+1), (num-1)), sep = "")
memory = num
}
string = paste(string, substr(inputstring,(memory+1), nchar(inputstring)),sep = "")
return(string)
}
调查这个问题,我发现了一段代码,它似乎将某些位置的字符替换为"-"
:
subchar <- function(string, pos) {
for(i in pos) {
string <- gsub(paste("^(.{", i-1, "}).", sep=""), "\\1-", string)
}
return(string)
}
我不太了解正则表达式(还),但我强烈怀疑这些方面的某些东西在时间上比第一个代码解决方案要好得多。不幸的是,当 pos 中的值变高时,这个 subchar 函数似乎会中断:
> test = subchar(data[1], 257)
Error in gsub(paste("^(.{", i - 1, "}).", sep = ""), "\\1-", string) :
invalid regular expression '^(.{256}).', reason 'Invalid contents of {}'
我也在考虑尝试使用 SQL 将字符串数据读入表中,但我希望会有一个优雅的字符串解决方案。在 R 中执行此操作的 SQL 实现似乎相当复杂。
有任何想法吗?谢谢!