2016-01-22 45 views
-3

我的数据格式如下所示。数据操作

order_id Prod1 prod2 Prod3 Prod4 Prod5 
    A    1  0  1  1  1 
    B    0  0  1  1  0 
    C    1  1  0  1  1 

我想要的方式来改造这个表,使得具有产品为“1”的所有订单ID应该是下一个被称为产品即

order_id Prod 
A   Prod1 
A   Prod3 
A   Prod4 
A   Prod5 
B   Prod3 
B   Prod4 

等新变种彼此相邻。我想它R.编程这方面的任何帮助,将不胜感激

回答

1

我们的数据melt以“长”格式,subset行,其中的“价值”为1,然后基于“ORDER_ID” order

library(reshape2) 
d1 <- subset(melt(df1, id.var='order_id'), value!=0, select=1:2) 
d1[order(d1$order_id),] 
# order_id variable 
#1   A Prod1 
#7   A Prod3 
#10  A Prod4 
#13  A Prod5 
#8   B Prod3 
#11  B Prod4 
#3   C Prod1 
#6   C prod2 
#12  C Prod4 
#15  C Prod5 
+1

谢谢你的帮助 – Rahul

0

两个替代解决方案:

1:使用dplyrtidyr

library(dplyr) 
library(tidyr) 
mydf %<>% gather(var, val, -1) %>% filter(val!=0) %>% select(-3) %>% arrange(order_id) 

2:使用data.table

library(data.table) 
mydf <- melt(setDT(mydf), 1)[value!=0][, value := NULL][order(order_id)] 

这既给:

> mydf 
    order_id variable 
1:  A Prod1 
2:  A Prod3 
3:  A Prod4 
4:  A Prod5 
5:  B Prod3 
6:  B Prod4 
7:  C Prod1 
8:  C prod2 
9:  C Prod4 
10:  C Prod5