2016-01-22 5 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» должны быть рядом друг с другом под новым вар под названием продукта т.е.

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

и т.д. , Я пытаюсь программировать его в R. Любой помощи в этой связи будет оценена

ответ

1

Мы melt данных в формат «длинный», subset строки, где «значение» равно 1, а затем order на основе «order_id» ,

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: использованием dplyr и tidyr

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 
Смежные вопросы