我看起来像这样 - 每个编号的列都是供应位置
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)
这是从宽到长格式的经典重塑。虽然您可以使用基础R中的melt
函数,但reshape2
包中的reshape
函数是我更喜欢这样做的。如果data.frame
是dat
}:
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"
)