Как я могу преобразовать таблицу корреляции или подобия в матрицу 696x696 - PullRequest
0 голосов
/ 26 мая 2018

Итак, вот полный набор данных в пастбине: https://pastebin.com/xpGMsSSf

Быстрая привязка пастбина:

`"V1","V2","N"
16,17,0.065532029
16,30,0.070163826
17,30,0.053089888
29,30,0.068024596`

Предварительная обработка данных: Iначалось со списка заказов клиентов и предметов в каждом заказе.Я подсчитал количество вхождений каждой пары предметов в одном и том же порядке.Затем я использовал «Индекс Джеккарда», чтобы вычислить сходство между предметами.Теперь я нахожусь там, где вы можете видеть в наборе данных.

Набор данных: Набор данных содержит номера материалов в V1 и V2.N = индекс сходства между предметами.Набор данных содержит только пару элементов, которые произошли вместе в одном и том же порядке.Поэтому существует множество пар, которых нет в наборе данных.

Моя цель: У меня 696 уникальных номеров предметов в диапазоне от 1 до 696.Я хочу 696x696 матрицу N в качестве значений.Значения «отсутствующих пар» в наборе данных должны быть равны нулю = это означает, что между этими двумя элементами нет сходства.

Для чего я буду использовать это? Я хочукластеризовать 696 элементов на основе их количества вхождений в том же порядке.

1 Ответ

0 голосов
/ 26 мая 2018

xtabs может использоваться для получения данных в нужной форме - также имеется приятная функция, позволяющая указывать результат в виде разреженной матрицы (у вас (nrow(dat)/696^2)

dat <- read.csv("https://pastebin.com/raw/xpGMsSSf")

# setting to factor introduces factor levels that are not found in the data
# see below for what is being done
dat[c("V1", "V2")] <- lapply(dat[c("V1", "V2")], factor, levels=1:696)

out <- xtabs( N ~ V1 + V2, dat, sparse=TRUE)

out[1:5, 1:5]

# To make symmetric
library(Matrix)
out[lower.tri(out)] <- t(out)[lower.tri(out)]

# Explanation of setting common factor levels
# example
x = c(1,2,3)
y = c(1,4,5)
table(x, y)
# but if we want both row and columns of table to include 1 to 5
# we can set to factor
x = factor(x, levels=1:5)
y = factor(y, levels=1:5)
table(x, y)

dput(head(mat))
structure(list(V1 = c(16L, 16L, 17L, 29L, 16L, 17L), V2 = c(17L, 
30L, 30L, 30L, 29L, 29L), N = c(0.065532029, 0.070163826, 0.053089888, 
0.068024596, 0.053083392, 0.041870099)), .Names = c("V1", "V2", 
"N"), row.names = c(NA, 6L), class = "data.frame")
...