2016-06-17 3 views
1

У меня есть фрейм данных, который представляет, если клиент купил определенные предметы. ФР выглядит следующим образом:Вычисление парных пар элементов

P1 P2 P3 P4 P5 
1 2 0 0 0 
1 1 0 0 0 
0 0 0 3 0 
1 0 0 1 0 
1 0 5 1 0 
1 1 0 0 0 

Я пытаюсь создать возникновение сколько семей приобрели каждую пару элемента в таблице. Оснастка выстрел результата хотел бы:

P1 P2 3 
P1 P3 1 
P1 P4 2 
--------- 

В качестве первого шага, я преобразовал данные в в двоичном формате - если элемент был приобретен. Однако я борюсь с функцией, чтобы преобразовать ее в группу пар элементов.

--- Я надеюсь создать сетевой график, используя эти данные, так, может быть, создание матрицы будет использование слишком

+1

Если размер ваших данных проблема, то вы можете подумать об упоминании этого в своем вопросе в следующий раз. Однако я удалил свой ответ из-за вашего грубого комментария, чтобы ответить на ваш вопрос, * да * мое решение (которое за полчаса до любого понравившегося вам ответа) эффективно масштабируется, если следовать встроенным инструкциям, чтобы обернуть его в функцию. См. '? Apply'. –

+0

Прошу прощения, не было моего намерения, спасибо за ваш ответ, хотя – user3562074

+1

См. Также [этот общий секретный код] (http://stackoverflow.com/questions/19891278/r-table-of-interactions-case-with -pets-и домов); 'as.data.frame (as.table (crossprod (as.matrix (d)> 0)))' –

ответ

3

Вызова данных d:

d = structure(list(P1 = c(1L, 1L, 0L, 1L, 1L, 1L), P2 = c(2L, 1L, 
0L, 0L, 0L, 1L), P3 = c(0L, 0L, 0L, 0L, 5L, 0L), P4 = c(0L, 0L, 
3L, 1L, 1L, 0L), P5 = c(0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("P1", 
"P2", "P3", "P4", "P5"), class = "data.frame", row.names = c(NA, 
-6L)) 

Мы можем использовать combn:

pairs = combn(x = names(d), m = 2) 
counts = combn(x = names(d), m = 2, FUN = function(x) sum(d[[x[1]]] > 0 & d[[x[2]]] > 0)) 

cbind.data.frame(t(pairs), counts) 
#  1 2 counts 
# 1 P1 P2  3 
# 2 P1 P3  1 
# 3 P1 P4  2 
# 4 P1 P5  0 
# 5 P2 P3  0 
# 6 P2 P4  0 
# 7 P2 P5  0 
# 8 P3 P4  1 
# 9 P3 P5  0 
# 10 P4 P5  0 
1

Вы можете использовать combn() построить так:

as.data.frame(t(combn(names(df),2, function(x) list(x[1], x[2], sum((df[,x[1]]*df[,x[2]])!=0))))) 
    V1 V2 V3 
1 P1 P2 3 
2 P1 P3 1 
3 P1 P4 2 
4 P1 P5 0 
5 P2 P3 0 
6 P2 P4 0 
7 P2 P5 0 
8 P3 P4 1 
9 P3 P5 0 
10 P4 P5 0 
+0

Ницца. Вы также можете сделать 'as.data.frame (t (combn (df, 2, function (x) c (имена (x), sum (x [1] * x [2]! = 0)))))' , – Psidom

2

Сначала сделайте все попарные комбинации имен столбцов:

res <- as.data.frame(t(combn(names(dat),2))) 

Затем сделать построчно суммированием присутствия в обеих колонках продажи:

res$counts <- apply(res, 1, function(rw) sum( 
            pmin(as.logical(dat[ ,rw[1] ]), #rw[1] is col name 
             as.logical(dat[ , rw[2] ]) # 2nd col name 
         )    )  ) 

> res 
    V1 V2 counts 
1 P1 P2  3 
2 P1 P3  1 
3 P1 P4  2 
4 P1 P5  0 
5 P2 P3  0 
6 P2 P4  0 
7 P2 P5  0 
8 P3 P4  1 
9 P3 P5  0 
10 P4 P5  0 
Смежные вопросы