我有一个函数,可以使用序数数据计算矩阵中的简单匹配距离:
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
即使存在缺失值,如何调整此功能来计算匹配距离?
提前致谢。
答案 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 :(得分:1)
我不确定我是否完全理解您的问题,但似乎您希望将NAs视为缺失值,而不是另一个“类别”。在这种情况下,您可以将data.frame中的列视为字符,并在所有内容之前粘贴任意字符(以使NAs像它们一样存在)。例如,
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)