2017-02-14 13 views
0

Я относительно новичок в R и на языках сценариев на основе матриц. Я написал эту функцию, чтобы возвращать индекс каждой строки, которая имеет контент, подобный содержимому любой другой строки. Это примитивная форма спама, которую я разрабатываю.Могу ли я еще раз прорисовать эту функцию

if (!require("RecordLinkage")) install.packages("RecordLinkage") 

library("RecordLinkage") 

# Takes a column of strings, returns a list of index's 
check_similarity <- function(x) { 
    threshold <- 0.8 
    values <- NULL 
    for(i in 1:length(x)) { 
    values <- c(values, which(jarowinkler(x[i], x[-i]) > threshold)) 
    } 
    return(values) 
} 

есть ли способ, которым я мог бы написать это, чтобы полностью избежать цикла for?

+1

@akrun обновлена, веселит – user2228313

+0

@db нет, я сравниваю против всех остальных строк, х [я], х [-i] – user2228313

+1

может попробовать это: ' m = as.matrix (sapply (x, jarowinkler, x))> порог; diag (m) = 0; который (rowSums (m)> 0) 'Нет воспроизводимых данных для меня, чтобы проверить, но я думаю, что это работает. – dww

ответ

1

Мы можем немного упростить код, используя sapply.

# some test data # 
x = c('hello', 'hollow', 'cat', 'turtle', 'bottle', 'xxx') 

# create an x by x matrix specifying which strings are alike 
m = sapply(x, jarowinkler, x) > threshold 

# set diagonal to FALSE: we're not interested in strings being identical to themselves 
diag(m) = FALSE 

# And find index positions of all strings that are similar to at least one other string 
which(rowSums(m) > 0) 
# [1] 1 2 4 5 

I.e. это возвращает позиции индекса «hello», «hollow», «turtle» и «bottle» как похожие на другие строки.

. Если вы предпочитаете, вы можете использовать colSums вместо rowSums для получения именованного вектора, но это может быть грязно, если строки длиной:

which(colSums(m) > 0) 
# hello hollow turtle bottle 
#  1  2  4  5 
Смежные вопросы