Просто добавив к @ HongOoi Я хочу указать, что в R !=
и ==
возвращают NA
, если одно из значений отсутствует, поэтому это может дать неверные результаты
> c(1, NA) == 1:2
[1] TRUE NA
однако %in%
выводит FALSE
для 1 %in% NA
сравнения.Из-за этого, если при сравнении векторов вы хотите считать пропущенные значения как «разные», то вы должны использовать sum(!((x != y) %in% FALSE))
код:
> x <- c(1, 8, 5, NA, 5)
> y <- 1:5
> sum(!((x != y) %in% FALSE))
[1] 3
Также обратите внимание, что может случиться так, что x
и y
векторы имеют разную длину, что может привести к отсутствию значений в более коротком векторе - вы можете сделать две вещи: усечь более длинный вектор или заявить, что значения, отсутствующие в более коротком векторе, «различны».Это можно перевести в автономную функцию со знакомыми параметрами R:
hamming <- function(x, y, na.rm = TRUE) {
size <- 1:max(length(x) & length(y))
x <- x[size]
y <- y[size]
if (na.rm) {
del <- is.na(x) & is.na(y)
x <- x[del]
y <- y[del]
}
sum(!((x != y) %in% FALSE))
}
Эта функция позволяет вам выбрать, хотите ли вы считать пропущенные значения как «разные» (na.rm = FALSE
) или игнорировать их.При na.rm = TRUE
, если векторы различаются по длине, более длинный усекается.