2013-05-28 27 views
0

在處理一些庫存訂單數據時,我懷疑需要轉置。數據框列出每個客戶每個物品的每個供應位置的數量,但我需要它爲每個供應位置分別設置一行在R中創建額外的行和轉置

我看起來像這樣 - 每個編號列是電源位置

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 

我需要的是

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 

對不起阿布可憐的佈局 - 第一次在這裏後。
不用擔心太多處理0數量的行,所以如果你有一個解決方案,保留它們並不重要

+0

感謝2個解決方案,但一個同事局勢複雜化。他們表示不應該以這種方式處理1個客戶端,並且僅對每個產品使用Total(例如,不要轉置/重新塑造DEF)。我知道我可以進行重塑,然後使用ddply將它們重新合併在一起。有沒有一種方法可以包含'[dat $ customer!=「DEF」] – user2426619

回答

2

這是從寬到長格式的典型重塑。從reshape2包的melt功能就是我喜歡做它,但你可以在基地使用reshape功能R.如果data.framedat

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

我已經刪除了Total.Order列(dat[,-9]),因爲看來你並不需要這個。

# 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

作品非常感謝。任何保持原有秩序的方式? – user2426619

+0

只需按照你想要的方式排序。在這種情況下:'dat.m < - dat.m [with(dat.m,order(Customer,Cust.location)),]' – alexwhan

2

是@alexwhan暗指基地重塑方法是非常相似:

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" 
)