2013-05-02 9 views
3

Pour une analyse, je voudrais transformer data de:valeurs Somme des combinaisons dans un groupe

data <- data.frame(
    Customer = c("A", "A", "B", "B", "C", "C", "C"), 
    Product = c("X", "Y", "X", "Z", "X", "Y", "Z"), 
    Value = c(10, 15, 5, 10, 20, 5, 10) 
) 
data 
# Customer Product Value 
# 1  A  X 10 
# 2  A  Y 15 
# 3  B  X  5 
# 4  B  Z 10 
# 5  C  X 20 
# 6  C  Y  5 
# 7  C  Z 10 

Pour:

Product Product Sum Value 
-------|-------|--------- 
X  |Y  |50 
X  |Z  |45 
Y  |Z  |15 

Fondamentalement, je veux obtenir la somme de la valeur pour chaque produit combinaison au sein d'un client. Je suppose que cela pourrait fonctionner avec l'aide du paquet remodeler mais je ne peux pas l'obtenir pour fonctionner.

Merci pour votre temps.

+1

À l'avenir, s'il vous plaît inclure un [** exemple reproductible **] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) avec votre question. –

Répondre

3

Voici une façon, en deux étapes:

1) transformer vos données en un long data.frame de toutes les paires au sein des clients. Pour cela, je compte sur combn pour fournir les indices de toutes les paires possibles:

process.one <- function(x) { 
    n <- nrow(x) 
    i <- combn(n, 2) 
    data.frame(Product1 = x$Product[i[1, ]], 
       Product2 = x$Product[i[2, ]], 
       Value = x$Value[i[1, ]] + 
         x$Value[i[2, ]]) 
} 

library(plyr) 
long <- ddply(data, "Customer", process.one) 
long 
# Customer Product1 Product2 Value 
# 1  A  X  Y 25 
# 2  B  X  Z 15 
# 3  C  X  Y 25 
# 4  C  X  Z 30 
# 5  C  Y  Z 15 

2), déposez la dimension Customer et agréger vos valeurs:

aggregate(Value ~ ., long[c("Product1", "Product2", "Value")], sum) 
# Product1 Product2 Value 
# 1  X  Y 50 
# 2  X  Z 45 
# 3  Y  Z 15 
+2

+ une belle solution. Pouvez-vous ajouter quelques explications sur votre fonction 'process.one'? –

+0

Merci! Ça marche. La longue table a fait l'affaire. – jeroen81

+0

@flodel Je viens de passer du temps à travailler sur ce que vous avez fait. C'est génial. S'il vous plaît ne me dites pas que c'était juste immédiatement intuitif pour vous? !! Des trucs géniaux. :-) –