【发布时间】:2012-08-16 08:09:57
【问题描述】:
我正在寻找一种方法来删除R中字符串中某些位置的字符。例如,如果我们有一个字符串"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 帖子:
R: How can I replace let's say the 5th element within a string?
不幸的是,建议的解决方案很难有效地概括,对于要删除的 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)
}
查看问题,我发现了一段sn-p的代码,好像是用"-"替换了某些位置的字符:
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 实现似乎相当复杂。
有什么想法吗? 谢谢!
【问题讨论】:
-
字符串从何而来?用 R 以外的方式预处理数据可能更容易。
-
字符串来自 .RData 文件,但我可以快速将其写入文本文件,从而打开范围。有什么语言建议吗?
-
他们总是用逗号分开数字吗?如果是这样,将它们分别转换为向量、子集,然后再转换回字符不是更容易吗?然后你可以使用数字索引来删除元素。
-
是的,它们总是以逗号分隔。不幸的是,正如帖子中所述,strsplit() 处理超过一百万个字符的字符串需要很长时间。有没有快速转换成向量的方法?