2013-05-28 4 views
0

Je gère certaines données de commande de stock et j'ai un problème avec ce que je soupçonne besoin d'une transposition. Le cadre de données répertorie la quantité pour chaque emplacement d'approvisionnement sur la ligne pour chaque client pour chaque article, mais j'en ai besoin pour avoir une ligne distincte pour chaque emplacement d'approvisionnementCréer des lignes supplémentaires et transposer dans R

Ce que j'ai ressemble à ceci - Chacune des colonnes numérotées est un emplacement d'alimentation

1. Customer Cust.location Product 116 117 41 25 81 Total.Order 
2. ABC Tap 123 5 3 0 2 1 11 
3. ABC Tap 456 0 1 4 0 2 7 
4. DEF Kar 123 1 0 0 3 4 8 

Ce que je dois est

1. Customer Cust.Location Product Source Total 
2. ABC  Tap   123  116  5 
3. ABC  Tap   123  117  3 
4. ABC  Tap   123  25  2 
5. ABC  Tap   123  81  1 
6. ABC  Tap   456  117  1 
7. ABC  Tap   456  41  4 
8. ABC  Tap   456  81  2 
9. DEF  Kar   123  116  1 
10.DEF  Kar   123  25  3 
11.DEF  Kar   123  81  4 

Désolé abou pauvres disposition - premier poste de temps ici.
Ne vous inquiétez pas trop de manipuler 0 qty lignes donc si vous avez une solution qui les retient, cela n'a pas d'importance

+0

Merci pour les 2 solutions, mais un collègue a compliqué la situation. Ils ont indiqué que 1 client ne devrait pas être manipulé de cette manière et n'utiliser que le total pour chaque produit (par exemple, ne pas transposer/remodeler DEF). Je sais que je peux faire la refonte, puis utiliser ddply pour les fusionner ensemble. Y at-il un moyen d'inclure '[dat $ Client! =" DEF "]' – user2426619

Répondre

2

Ceci est un remodelage classique du format large au format long. La fonction melt du paquet reshape2 est que je préfère le faire, mais vous pouvez utiliser la fonction reshape dans la base R. Si votre data.frame est dat:

library(reshape2) 
dat.m <- melt(dat[,-9], id.vars= c("Customer", "Cust.location", "Product"), 
       variable.name="Source", value.name="Total") 

J'ai enlevé la colonne Total.Order (dat[,-9]) parce que il semble que tu n'aies pas besoin de ça.

# Customer Cust.location Product Source Total 
# 1  ABC   Tap  123 116  5 
# 2  ABC   Tap  456 116  0 
# 3  DEF   Kar  123 116  1 
# 4  ABC   Tap  123 117  3 
# 5  ABC   Tap  456 117  1 
# 6  DEF   Kar  123 117  0 
# 7  ABC   Tap  123  41  0 
# 8  ABC   Tap  456  41  4 
# 9  DEF   Kar  123  41  0 
# 10  ABC   Tap  123  25  2 
# 11  ABC   Tap  456  25  0 
# 12  DEF   Kar  123  25  3 
# 13  ABC   Tap  123  81  1 
# 14  ABC   Tap  456  81  2 
# 15  DEF   Kar  123  81  4 
+0

Fonctionne donc merci pour cela. Tout moyen de conserver l'ordre original? – user2426619

+0

Il suffit de le trier comme vous le souhaitez. Dans ce cas: 'dat.m <- dat.m [avec (dat.m, order (Customer, Cust.location)),]' – alexwhan

2

méthode Reshape de base qui @alexwhan fait allusion à est très similaire:

dat <- read.table(text="Customer Cust.location Product 116 117 41 25 81 Total.Order 
ABC Tap 123 5 3 0 2 1 11 
ABC Tap 456 0 1 4 0 2 7 
DEF Kar 123 1 0 0 3 4 8",header=TRUE) 

reshape(
    dat[,-9], 
    idvar=c("Customer","Cust.location", "Product"), 
    varying=4:8, 
    v.names="Total", 
    timevar="Source", 
    times=names(dat[4:8]), 
    direction="long" 
) 
Questions connexes