在R中创建其他行并进行转置

时间:2013-05-28 00:32:57

标签: r transpose

我正在处理一些库存订单数据,并且遇到了我怀疑需要转置的问题。数据框列出了每个项目的每个客户的每个供应位置的数量,但我需要为每个供应地点分别设置一行

我看起来像这样 - 每个编号的列都是供应位置

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个数量的行并不太担心,所以如果你有一个保留它们的解决方案并不重要

2 个答案:

答案 0 :(得分:2)

这是从宽到长格式的经典重塑。虽然您可以使用基础R中的melt函数,但reshape2包中的reshape函数是我更喜欢这样做的。如果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

答案 1 :(得分: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"
)