1

次のベクトルのようなものがあるとします。

text <- as.character(c("string1", "str2ing", "3string", "stringFOUR", "5tring", "string6", "s7ring", "string8", "string9", "string10"))

これらの文字列のすべての可能な組み合わせ (例: 文字列 1 から文字列 2、文字列 1 から文字列 3 など) の編集距離をペア単位で比較するループを実行したいと考えています。出力は、行が文字列の数に等しく、列が文字列の数に等しい行列形式である必要があります。

私は以下のコードを持っています:

#Matrix of pair-wise combinations
m <- expand.grid(text,text)

#Define number of strings
n <- c(1:10)

#Begin loop; "method='osa'" in stringdist is default
for (i in 1:10) {
  n[i] <- stringdist(m[i,1], m[i,2], method="osa")
  write.csv(data.frame(distance=n[i]),file="/File/Path/output.csv",append=TRUE)
  print(n[i])
  flush.console()
}

stringdist() 関数は stringdist{} パッケージに含まれていますが、この関数はベース utils パッケージにも adist() としてバンドルされています。

私の質問は、ループが結果を行列として書き込んでいないのはなぜですか、ループが個々の距離計算を上書きしないようにするにはどうすればよいですか (つまり、すべての結果を行列形式で保存します)。

4

1 に答える 1

0

stringdistmatrixの代わりに使用することをお勧めしstringdist ます (特に を使用している場合expand.grid)

 res <- stringdistmatrix(text, text)
 dimnames(res) <- list(text, text)  
 write.csv(res, "file.csv")

具体的な質問 については、「私の質問は、なぜ私のループが結果を行列として書き込んでいないのかということです」
出力が行列であると予想される理由が明確ではありませんか? 一度に要素を計算し、それをベクトルに保存してから、そのベクトルをディスクに書き込みます。

また、 の引数はほとんど役に立たないことに注意する必要がありますwrite.csv(デフォルトが何であるかをユーザーに思い出させるためだけにあると思います)。write.table代わりに使用

これを繰り返し実行したい場合は、次のようにします。

# Column names, outputted only one time
write.table(rbind(names(data.frame(i=1, distance=n[1])))
            ,file="~/Desktop/output.csv",append=FALSE   # <~~ Don't append for first run.
             , sep=",", col.names=FALSE, row.names=FALSE)

for (i in 1:10) {
  n[[i]] <- stringdist(m[i,1], m[i,2], method="osa")
  write.table(data.frame(i=i, distance=n[i]),file="~/Desktop/output.csv"
              ,append=TRUE, sep=",", col.names=FALSE, row.names=FALSE)
  print(n[[i]])
  flush.console()
}
于 2013-08-05T22:58:06.783 に答える