2013-08-05 2 views
1

Предположим, у меня есть что-то вроде следующего вектора:Запиши результаты для цикла мер расстояния в виде матрицы в R

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()

Вопрос в том, почему моя петля не записывает результаты в виде матрицы, и как остановить цикл от перезаписи каждого отдельного расчета расстояния (т. Е. Сохранить все результаты в матричной форме)?

+0

+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() 
} 
+0

R Сессии прерываются большими строками (из-за проблем с памятью/памятью). Следовательно, почему я использую матричную нотацию, stringdist() в отличие от stringdistmatrix() и периодически сохраняю и печатаю результаты во время выполнения цикла –

+0

@DVHughes, что имеет смысл. Попробуйте вместо этого использовать 'write.table' (см. Править) –