Rの文字列内の特定の位置にある文字を削除する方法を探しています。たとえば、文字列がある場合"1,2,1,1,2,1,1,1,1,2,1,1"
、3番目、4番目、7番目、8番目の位置を削除したいと思います。この操作により、文字列が作成されます"1,1,2,1,1,1,1,2,1,1"
。
残念ながら、strsplitを使用して文字列をリストに分割することはできません。これは、私が使用している文字列の長さが100万文字を超えているためです。私が約2,500本の弦を持っていることを考えると、かなりの時間がかかることがわかります。
あるいは、文字を空の文字列に置き換える方法を見つけること""
も同じ目的を達成すると思います。この考え方を調べて、私はこのStackOverflowの投稿に出くわしました:
R:文字列内の5番目の要素を置き換えるにはどうすればよいですか?
残念ながら、提案された解決策を効率的に一般化することは困難であり、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)
}
私は正規表現を(まだ)完全には理解していませんが、これらの線に沿った何かが最初のコードソリューションよりも時間的にはるかに優れているのではないかと強く疑っています。残念ながら、このsubchar関数は、posの値が高くなると機能しなくなるようです。
> 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実装は、かなり複雑に思えます。
何か案は?ありがとう!