Как создать реляционную матрицу? - PullRequest
0 голосов
/ 20 октября 2019

У меня есть следующие данные:

client_id <- c(1,2,3,1,2,3)
product_id <- c(10,10,10,20,20,20)
connected <- c(1,1,0,1,0,0)
clientID_productID <- paste0(client_id,";",product_id) 
df <- data.frame(client_id, product_id,connected,clientID_productID)

  client_id product_id connected clientID_productID
1         1         10         1               1;10
2         2         10         1               2;10
3         3         10         0               3;10
4         1         20         1               1;20
5         2         20         0               2;20
6         3         20         0               3;20

Цель состоит в том, чтобы создать реляционную матрицу:

  client_id product_id clientID_productID client_pro_1_10 client_pro_2_10 client_pro_3_10 client_pro_1_20 client_pro_2_20 client_pro_3_20
1         1         10               1;10               0               1               0               0               0               0
2         2         10               2;10               1               0               0               0               0               0
3         3         10               3;10               0               0               0               0               0               0
4         1         20               1;20               0               0               0               0               0               0
5         2         20               2;20               0               0               0               0               0               0
6         3         20               3;20               0               0               0               0               0               0

Другими словами, когда product_id равен 10, клиенты 1 и 2 являютсясвязано. Важно отметить, что я не хочу, чтобы клиент 1 был связан с собой. Когда product_id = 20, у меня есть только один клиент, то есть у меня нет связи, поэтому у меня должны быть только нули.

Чтобы быть более точным, все, что я пытаюсь создать, - это квадратная матрица отношений,со всеми комбинациями клиент / продукт в столбцах. Клиент может быть связан только с другим, если он купил тот же продукт.

Я искал группу и играл с другим кодом. Разница между этой проблемой и другими уже отвеченными в том, что я хочу оставить на своем столе клиента № 3, хотя она никогда не покупала какой-либо продукт. Я хочу показать, что у нее нет отношений с любым другим клиентом. Прямо сейчас я могу создать матрицу, сложив отношения по продуктам ( Как создать реляционную матрицу в R? ), но я изо всех сил пытаюсь не сложить их.

Я прошу прощения, если вопрос не является достаточно конкретным или слишком конкретным. Спасибо, в любом случае, stackoverflow - это спасение для начинающих.

1 Ответ

0 голосов
/ 20 октября 2019

Полагаю, я понял это.

Хотя, конечно, это не самый элегантный ответ.

client_id <- c(1,2,3,1,2,3)
product_id <- c(10,10,10,20,20,20)
connected <- c(1,1,0,1,0,0)
clientID_productID <- paste0(client_id,";",product_id) 
df <- data.frame(client_id, product_id,connected,clientID_productID)

df2 <- inner_join(df[c(1:3)], df[c(1:3)], by = c("product_id", "connected"))

df2$Source <- paste0(df2$client_id.x,"|",df2$product_id)
df2$Target <- paste0(df2$client_id.y,"|",df2$product_id)
df2 <- df2[order(df2$product_id),]

indices = unique(as.character(df2$Source))

mtx <- as.matrix(dcast(df2, Source ~ Target, value.var="connected", fill=0))
rownames(mtx) = mtx[,"Source"]
mtx <- mtx[,-1]
diag(mtx)=0

mtx = as.data.frame(mtx)
mtx = mtx[indices, indices]

Я получил желаемый результат:

     1|10 2|10 3|10 1|20 2|20 3|20
1|10    0    1    0    0    0    0
2|10    1    0    0    0    0    0
3|10    0    0    0    0    0    0
1|20    0    0    0    0    0    0
2|20    0    0    0    0    0    0
3|20    0    0    0    0    0    0
...