2016-02-08 3 views
1

У меня есть кадр данных, который содержит один столбец, который указывает идентификатор события. Существует еще один столбец, который указывает на продукты, используемые в этом событии. Каждый продукт будет использоваться только один раз для события, и каждое событие содержит по крайней мере один продукт. Я хотел бы знать, сколько раз каждый продукт используется с каждым другим продуктом. Некоторые данные пробы ниже:Создание кадра данных из числа пар на основе столбца события

set.seed(1) 
events <- paste('Event ', sample(1:4, size = 15, replace = TRUE), sep = '') 
events <- events[order(events)] 

prods <- paste('Product ', c(1, 2, 3, 4, 1, 5, 6, 2, 4, 6, 7, 1, 2, 3, 5)) 

test_data <- data.frame(events, prods) 
test_data 
    events  prods 
1 Event 1 Product 1 
2 Event 1 Product 2 
3 Event 1 Product 3 
4 Event 1 Product 4 
5 Event 2 Product 1 
6 Event 2 Product 5 
7 Event 2 Product 6 
8 Event 3 Product 2 
9 Event 3 Product 4 
10 Event 3 Product 6 
11 Event 3 Product 7 
12 Event 4 Product 1 
13 Event 4 Product 2 
14 Event 4 Product 3 
15 Event 4 Product 5 

Продукт 1 и Продукт 2 происходит в том же событии в два раза (Событие 1 и событие 4). Поэтому я хотел бы вернуть «2» для этого матча. Продукт 1 и Продукт 7 никогда не встречаются в одном и том же событии, поэтому я хочу вернуть 0 для этой пары. Для «совпадений» между одним и тем же элементом я уверенно возвращаю общее количество раз, когда этот продукт используется.

Есть два формата, которые возможны, и у меня нет предпочтения, для которых я хотел бы вернуться.

  1. Короткая и толстая фрейм данных, в которой продукты работают по вершинам в виде заголовков столбцов и стороны в виде заголовков строк. Тело этого кадра данных будет заполнено количеством совпадений.
  2. Длинный узкий кадр данных, в котором есть два столбца, которые будут служить для представления всех возможных комбинаций продуктов, а затем третий столбец, представляющий количество раз, когда они совпадают.

Я экспериментировал с expand.grid, чтобы ничего не показать.

Спасибо!

ответ

2

Разделить prods на events, а затем рассчитать все значения combn -inations, затем aggregate, чтобы получить счет каждой комбинации.

out <- t(do.call(cbind, 
    lapply(split(as.character(test_data$prods), test_data$events), combn, 2)) 
) 
aggregate(count ~ . , data=transform(out,count=1), FUN=sum) 

#   X1   X2 count 
#1 Product 1 Product 2  2 
#2 Product 1 Product 3  2 
#3 Product 2 Product 3  2 
#4 Product 1 Product 4  1 
#5 Product 2 Product 4  2 
#6 Product 3 Product 4  1 
#7 Product 1 Product 5  2 
#8 Product 2 Product 5  1 
#9 Product 3 Product 5  1 
#10 Product 1 Product 6  1 
#11 Product 2 Product 6  1 
#12 Product 4 Product 6  1 
#13 Product 5 Product 6  1 
#14 Product 2 Product 7  1 
#15 Product 4 Product 7  1 
#16 Product 6 Product 7  1 
+0

спасибо. Первоначально я думал, что мне нужно будет иметь «нулевые пары», но я думаю, что без них они будут работать. –

1

Возможно, это использует кувалду, чтобы взломать гайку, но вы могли бы использовать мои (частые) наборы предметов, которые поставляются с другими причудливыми вещами. Он может работать следующим образом:

library(arules) 
library(reshape2) 
mat <- as(sapply(dcast(test_data, events~prods, fun.aggregate = length, value.var="prods")[, -1], as.logical), "transactions") 
sets <- apriori(trans, parameter = list(supp = 0, conf = 0, minlen = 2, maxlen = 2, target = "frequent itemsets")) 
df <- as(sets, "data.frame") 
subset(transform(df, n=support*nrow(trans)), n>0, -support) 
#      items n 
# 2 {Product 6,Product 7} 1 
# 4 {Product 4,Product 7} 1 
# 6 {Product 2,Product 7} 1 
# 7 {Product 5,Product 6} 1 
# 8 {Product 3,Product 5} 1 
# 10 {Product 1,Product 5} 2 
# 11 {Product 2,Product 5} 1 
# 13 {Product 4,Product 6} 1 
# 14 {Product 1,Product 6} 1 
# 15 {Product 2,Product 6} 1 
# 16 {Product 3,Product 4} 1 
# 17 {Product 1,Product 3} 2 
# 18 {Product 2,Product 3} 2 
# 19 {Product 1,Product 4} 1 
# 20 {Product 2,Product 4} 2 
# 21 {Product 1,Product 2} 2 

Значение поддержки показывает процент событий, в которые были включены оба продукта. Я умножил его на количество транзакций, чтобы получить частоту.

Смежные вопросы