У меня есть общая формула, которая должна применяться к каждой ячейке матрицы.
Sij = Nij / sqrt(Ni*Nj)
Ni и Nj уже определены в векторе "count" как (A, B, C, D, E).Вы можете думать о них как о Na, Nb, Nc, Nd, Ne;эти значения войдут в знаменатель.
Nij определены в матрице "mat_ans_2".Вы можете думать о них как о Nab, Nac, Nad и т. Д .;эти значения войдут в числитель.
Исходя из этого, я хочу сгенерировать новую матрицу, которая имеет все вычисления Sij.Это будет выглядеть следующим образом:
A B C D E
A 1 0.4842
B 0.4842 1
C 1
D 1
E 1
Диагональ будет установлена в 1 по умолчанию.Значение, которое входит в AB, получается из этой формулы:
Sab = Nab/sqrt(Na*Nb) = 0.4842
К сожалению, мне не так повезло с генерацией функции "for".
Cij = mat_ans_2
diag(Cij) <- 1
Si = count
Sj = count
Si <- matrix(Si, nrow = length(Si), ncol = length(Si), byrow = TRUE)
Sj <- matrix(Sj, nrow = length(Sj), ncol = length(Sj), byrow = FALSE)
for (i,j in count) {
SC <- (Cij)/sqrt(Si * Sj)
SC[is.na(SC)] <- 0
diag(SC) <- 1
return(SC)
}
Что такоелучший способ, чтобы R смог распознать каждый адрес и выполнить формулу соответственно?
dput(mat_ans_2)
structure(c(1, 1.21666666666667, 0.55, 0.15, 0, 1.21666666666667,
1, 1.81666666666667, 0.75, 0.35, 0.55, 1.81666666666667, 1, 1.98333333333333,
0.533333333333333, 0.15, 0.75, 1.98333333333333, 1, 2.7, 0, 0.35,
0.533333333333333, 2.7, 1), .Dim = c(5L, 5L), .Dimnames = list(
c("A", "B", "C", "D", "E"), c("A", "B", "C", "D", "E")))
dput(count)
structure(list(class = c("A", "B", "C", "D", "E"), `sum(weight, na.rm = TRUE)` = c(1.59166666666667,
3.96666666666667, 3.29166666666667, 3.35833333333333, 3.29166666666667
)), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame"
), .internal.selfref = <pointer: 0x000001e7d1611ef0>)