2016-07-08 39 views
1

我有一个数据框,包含过去12个月的库存数据。我在下面创建了三个月的模拟数据框,这与我的数据集相似。整形数据帧的整形

inventory <- data.frame(ID=c(1,1,1,1,2,2,3,3,3,3,4,4,4), 
         SKU=c("375F","375F","375F","375F","QX51","QX51","AEC","AEC","AEC","AEC","115332H","115332H","115332H"), 
         inventory=c(3,4,14,5,18,5,4,13,4,10,3,2,2), 
         sold=c(3,2,0,1,4,0,0,3,1,5,0,2,1), 
         returned=c(1,0,2,0,0,0,1,0,1,1,0,2,0), 
         month=c(0,1,2,3,0,2,3,0,1,2,3,2,3)) 

我试图操纵数据帧以产生显示每个变量与它们的ID和SKU和每个月一列,像下面的图像的报告。

重塑的数据框我尝试过使用dplyr和data.table库,但没有取得任何成功。如何将数据转换为每个月都有一列,就像我发布的图片一样? R对我来说还很新,所以放在我身上很容易。谢谢。

enter image description here

+1

你应该在问题中包含你的图片。插入链接到图片是一个坏主意,因为最终这些链接变得不可用,未来的用户将无法从您的问题中受益。你可以编辑你的帖子来解决这个问题。 – Andrej

+0

谢谢你的提示,Andrej。更新。 –

+0

更好的是,不要使用图像。有更好的方法来显示预期的结果。 – Sotos

回答

4

没有为ID = 4 and SKU = 115332H的复制,所以我不得不改变的值删除重复。

# Creating the data frame 
inventory <- data.frame(ID=c(1,1,1,1,2,2,3,3,3,3,4,4,4), 
         SKU=c("375F","375F","375F","375F","QX51","QX51","AEC","AEC","AEC","AEC","115332H","115332H","115332H"), 
         inventory=c(3,4,14,5,18,5,4,13,4,10,3,2,2), sold=c(3,2,0,1,4,0,0,3,1,5,0,2,1), 
         returned=c(1,0,2,0,0,0,1,0,1,1,0,2,0), 
         month=c(0,1,2,3,0,2,3,0,1,2,1,2,3)) 

# Reshaping the data 
    # Melting the data frame 
    inv2 <- melt(inventory,id=c("ID","SKU","month")) 
    # Reshaping 
    inv2_wide <- reshape(inv2,v.names = "value",idvar = c("ID","SKU","variable"), 
         timevar = "month", direction = "wide") 

# Ordering by ID variables 
inv2_wide <- inv2_wide[order(inv2_wide$ID,inv2_wide$SKU),] 

# Renaming the variables 
names(inv2_wide) <- gsub("value\\.","Month",names(inv2_wide)) 


    ID  SKU variable Month0 Month1 Month2 Month3 
1 1 375F inventory  3  4  14  5 
14 1 375F  sold  3  2  0  1 
27 1 375F returned  1  0  2  0 
5 2 QX51 inventory  18  NA  5  NA 
18 2 QX51  sold  4  NA  0  NA 
31 2 QX51 returned  0  NA  0  NA 
7 3  AEC inventory  13  4  10  4 
20 3  AEC  sold  3  1  5  0 
33 3  AEC returned  0  1  1  1 
11 4 115332H inventory  NA  3  2  2 
24 4 115332H  sold  NA  0  2  1 
37 4 115332H returned  NA  0  2  0 
1

我们可以使用tidyr

library(dplyr) 
library(tidyr) 
gather(inventory, Variable,value, inventory:returned) %>% #reshape to long 
     mutate(month = paste0("Month", month)) %>% #concat with "Month" string 
     spread(month, value)#reshape to wide 
# ID  SKU Variable Month0 Month1 Month2 Month3 
#1 1 375F inventory  3  4  14  5 
#2 1 375F returned  1  0  2  0 
#3 1 375F  sold  3  2  0  1 
#4 2 QX51 inventory  18  NA  5  NA 
#5 2 QX51 returned  0  NA  0  NA 
#6 2 QX51  sold  4  NA  0  NA 
#7 3  AEC inventory  13  4  10  4 
#8 3  AEC returned  0  1  1  1 
#9 3  AEC  sold  3  1  5  0 
#10 4 115332H inventory  NA  3  2  2 
#11 4 115332H returned  NA  0  2  0 
#12 4 115332H  sold  NA  0  2  1