1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
jaccard_dist_matrix = function(x, by.row = F) {
x = as.matrix(x);
if (by.row == F) {
x = t(x)
}
m = matrix(nrow=nrow(x), ncol=nrow(x));
diag(m) = 0;
colnames(m) = rownames(x);
rownames(m) = rownames(x);
# operates by rows.
for (i in 1:(nrow(x)-1)) {
message("row (",i,")");
for (j in (i+1):nrow(x)) {
num_same = sum(na.omit(x[i,] == x[j,]));
num_diff = sum(na.omit(x[i,] != x[j,]));
total = num_same + num_diff;
jaccard = ifelse (total > 0, 1 - (num_same / (num_same + num_diff)), 1);
m[i,j] = jaccard;
m[j,i] = jaccard;
}
}
return(m)
}
|