R: Преобразование большого кадра данных в матрицу попарной корреляции - PullRequest
1 голос
/ 13 октября 2019

У меня есть данные в виде:

df <- data.frame(group = c(rep(1,5),rep(2,5),rep(3,5),rep(4,5),rep(5,5)),
                  thing = c(rep(c('a','b','c','d','e'),5)),
                  score = c(1,1,0,0,1,1,1,0,1,0,1,1,1,0,0,0,1,1,0,1,0,1,0,1,0))

, который сообщает "оценку" для каждой "вещи" для группы "групп".

Я хотел бы создатьматрица корреляции, которая показывает корреляции попарных баллов для всех «вещей» на основе корреляции в их баллах по группам:

         thing_a thing_b thing_c thing_d thing_e
thing_a  1       .       .       .       .
thing_b  corr    1       .       .       .
thing_c  corr    corr    1       .       .
thing_d  corr    corr    corr    1       .
thing_e  corr    corr    corr    corr    1

Например, данные, лежащие в основе корреляции между вещью «а» и вещью »b "было бы:

group  thing_a_score  thing_b_score
1      1              1
2      1              1
3      1              1
4      0              1
5      0              1

На самом деле число уникальных групп составляет ~ 1000, а количество вещей ~ 10000, поэтому мне нужен подход, который более эффективен, чем грубая сила для цикла.

Мне не нужно, чтобы результирующая матрица корреляций находилась в одной матрице или даже в самой матрице (т. Е. Это могла быть группа наборов данных с тремя столбцами "thing_1 thing_2 corr").

1 Ответ

2 голосов
/ 14 октября 2019

Сначала вы можете dcast свои данные и использовать функцию cor() для получения матрицы корреляции:

library(data.table)
dt <- data.table(
  group = c(rep(1,5),rep(2,5),rep(3,5),rep(4,5),rep(5,5)),
  thing = c(rep(c('a','b','c','d','e'),5)),
  score = c(1,1,0,0,1,1,1,0,1,0,1,1,1,0,0,0,1,1,0,1,0,1,0,1,0)
)
dt

m <- dcast(dt, group ~ thing, value.var = "score")

cor(m[, -1])

data.table обычно выполняется, но если она не работает для вас, пожалуйста, напишитеВоспроизводимый пример, который генерирует большой объем данных, кто-то может сравнить скорость и память на разных решениях.

...