Цикл через фрейм данных: подсчет каждой попарной комбинации значений для каждой уникальной переменной.
У меня есть фрейм данных под названием " df " вот так:
ID Value
1 a
1 b
1 c
1 d
3 a
3 b
3 e
3 f
. .
. .
. .
У меня есть матрица, заполненная нулями, как это:
a b c d e f
a x 0 0 0 0 0
b 0 x 0 0 0 0
c 0 0 x 0 0 0
d 0 0 0 x 0 0
e 0 0 0 0 x 0
f 0 0 0 0 0 x
Затем я хотел бы сделать цикл через фрейм данных примерно так:
for each ID, for each value i, for each value j != i, matrix[i,j] += 1
Поэтому для каждого идентификатора, для каждой комбинации значений, я хотел бы поднять значение в матрице на 1, в результате чего:
a b c d e f
a x 2 1 1 1 1
b 2 x 1 1 1 1
c 1 1 x 1 0 0
d 1 1 1 x 0 0
e 1 1 0 0 x 1
f 1 1 0 0 1 x
Так, например, [a, b] = 2, потому что эта комбинация значений встречается для двух разных идентификаторов, в то время как [a, c] = 1, потому что эта комбинация значений происходит только тогда, когда ID = 1, а не когда ID = 3.
Как я могу этого достичь? Я уже сделал вектор, содержащий уникальные идентификаторы.
Заранее благодарю.
1 ответ:
Проще всего было бы получить
table
, а затем сделатьcrossprod
out <- crossprod(table(df)) diag(out) <- NA #replace the diagonals with NA names(dimnames(out)) <- NULL #set the names of the dimnames as NULL out # a b c d e f #a NA 2 1 1 1 1 #b 2 NA 1 1 1 1 #c 1 1 NA 1 0 0 #d 1 1 1 NA 0 0 #e 1 1 0 0 NA 1 #f 1 1 0 0 1 NA
Данные
df <- structure(list(ID = c(1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L), Value = c("a", "b", "c", "d", "a", "b", "e", "f")), .Names = c("ID", "Value" ), class = "data.frame", row.names = c(NA, -8L))