У меня довольно большой data.table
с двумя столбцами, id
и var
:
head(DT)
# id var
# 1: 1 B
# 2: 1 C
# 3: 1 A
# 4: 1 C
# 5: 2 B
# 6: 2 C
Я хотел бы создать своего рода кросс-таблицу, которая будет показывать, сколько раз различались две длины двух комбинаций var
в данных.
Ожидаемый результат для данных образца:
out
# A B C
# A 0 3 3
# B NA 1 3
# C NA NA 0
Объяснение:
- диагональ результирующей матрицы /data.frame/data.table подсчитывает, сколько раз все
var
, которые имели место дляid
, были одинаковыми (либо всеA
, либоB
, илиC
). В данных образцаid
4 имеет только одну запись иB
, поэтомуB
-B
равен 1 в желаемом результате. - верхний треугольник подсчитывает количество
id
двух конкретныхvar
, т.е. комбинацияA
-B
присутствует в 3id
s, а также комбинацииA
-C
иB
-C
. - Обратите внимание, что для любого
id
единственная комбинация из двухvar
может быть только 0 (нет) или 1 (присутствует), т.е. я не хочу считать ее несколько раз заid
. - нижний треугольник результата может быть оставлен NA или 0, или он может иметь те же значения, что и верхний треугольник, но это будет избыточным.
(Результат может также быть задан в формате long-format, если имеется соответствующая информация.)
Я уверен, что есть умный (эффективный) способ вычислить это, но я не могу сейчас обволакивать его.
Пример данных:
DT <- structure(list(id = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L), var = c("B", "C", "A",
"C", "B", "C", "C", "A", "B", "B", "C", "C", "C", "C", "B", "C",
"B", "A", "C", "B")), .Names = c("id", "var"), row.names = c(NA,
-20L), class = "data.frame")
library(data.table)
setDT(DT, key = "id")