1

我有一个函数可以用序数数据计算矩阵中的简单匹配距离:

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

即使存在缺失值,如何调整此函数来计算匹配距离?

4

2 回答 2

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向量会受到浮点错误的影响,因此==不会总是返回您的想法。如果您将数据存储为integers 的矩阵,这将不是问题。

于 2013-05-05T19:01:35.303 回答
1

我不确定我是否完全理解您的问题,但似乎您不想将 NA 视为缺失值,而是将其视为另一个“类别”。在这种情况下,您可以将 data.frame 中的列视为字符,并在所有内容前面粘贴任意字符(让 NA 表现得像它们存在一样)。例如,

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)

于 2013-05-05T19:02:47.057 回答