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{} 包,但该函数也作为 adist() 捆绑在基本 utils 包中

我的问题是,为什么我的循环没有将结果写为矩阵,以及如何阻止循环覆盖每个单独的距离计算(即:以矩阵形式保存所有结果)?

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 回答