Цикл через фрейм данных: подсчет каждой попарной комбинации значений для каждой уникальной переменной.


У меня есть фрейм данных под названием " 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 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))