2013-05-05 4 views
1

У меня есть функция, которая вычисляет простые соответствия расстояния в матрице с порядковым данных:Обработка Nas при расчете соответствующие расстояния с пакетом «прокси»

require(proxy) 
m <- test 
f <- function(x,y) sum(x == y)/NROW(x) 
matches <- as.matrix(dist(m, f, upper=TRUE)) 

Проблема в том, что эта функция не будет работать, если отсутствуют значения, например, в следующей матрице.

test <- structure(list(X1 = c(1, 2, 3, 4, 2, NA), X2 = c(2, 3, 4, 5, 
3, 6), X3 = c(3, 4, NA, 5, 3, 2), X4 = c(2, 4, 6, 5, 3, 8), X5 = c(1, 
3, 2, 4, 6, 4)), .Names = c("X1", "X2", "X3", "X4", "X5"), row.names = c(NA, 
6L), class = "data.frame") 

Полученная матрица расстояний для этого будет:

> matches 
    1 2 3 4 5 6 
1 0.0 0.0 NA 0 0.2 NA 
2 0.0 0.0 NA 0 0.4 NA 
3 NA NA 0 NA NA NA 
4 0.0 0.0 NA 0 0.0 NA 
5 0.2 0.4 NA 0 0.0 NA 
6 NA NA NA NA NA 0 

Как я могу адаптировать эту функцию, чтобы вычислить соответствующие расстояния, даже когда отсутствует значение?

Заранее спасибо.

ответ

1

Как это:

f <- function(x,y) mean(x == y, na.rm = TRUE) 

as.matrix(dist(m, f, upper=TRUE)) 
#  1 2 3 4 5 6 
# 1 0.0 0.0 0 0.00 0.2 0.00 
# 2 0.0 0.0 0 0.00 0.4 0.00 
# 3 0.0 0.0 0 0.00 0.0 0.00 
# 4 0.0 0.0 0 0.00 0.0 0.25 
# 5 0.2 0.4 0 0.00 0.0 0.00 
# 6 0.0 0.0 0 0.25 0.0 0.00 

Также следует знать, что numeric векторы могут быть плавающей запятой ошибки так == не всегда будет возвращать то, что вы думаете. Это не будет проблемой, если вы сохраните свои данные в виде матрицы integer s.

1

Я не уверен, что полностью понимаю ваш вопрос, но кажется, что вы хотите рассматривать НС не как недостающее значение, а еще одну «категорию». В этом случае вы можете обрабатывать столбцы в вашем файле data.frame как символы и вставлять произвольный символ перед всем (чтобы НС действовали так, как они существуют). Например,

for (i in 1:length(test)) test[[i]] <- paste0("*", as.character(test[[i]])) 

Тогда

require(proxy) 
m <- test 
f <- function(x,y) sum(x == y)/length(x) 
matches <- as.matrix(dist(m, f, upper=TRUE)) 

1 2 3 4 5 6 
1 0.0 0.0 0 0.0 0.2 0.0 
2 0.0 0.0 0 0.0 0.4 0.0 
3 0.0 0.0 0 0.0 0.0 0.0 
4 0.0 0.0 0 0.0 0.0 0.2 
5 0.2 0.4 0 0.0 0.0 0.0 
6 0.0 0.0 0 0.2 0.0 0.0 

Обратите внимание, что я изменил NROW(x) к length(x)

Смежные вопросы