2016-08-05 7 views
2

Я хочу изменить мои данные, который находится в следующей форме в dataframe:RESHAPE данные из строк в столбце в dataframe в R

a b Type_c d e 
1 1 0  10 9 
2 1 0  20 9 
3 2 1  30 4 
4 2 2  40 3 
5 3 3  50 2 
6 3 0  60 1 
7 4 3  70 2 
8 4 2  80 7 
9 4 2  90 8 

И хотел бы получить данные в следующем формате путем изменения формы или преобразования ,

a b Type_0_d Type_0_e Type_1_d Type_1_e type_2_d type_2_e type_3_d type_3_e 
1 1 10  9   0  0   0  0   0   0 
2 1 20  9   0  0   0  0   0   0 
3 2 0  0   30  4   0  0   0   0 
4 2 0  0   0  0  40  3   0   0 
5 3 0  0   0  0   0  0  50   2 
6 3 60  1   0  0   0  0   0   0 
7 4 0  0   0  0   0  0  70   2 
8 4 0  0   0  0  80  7   0   0 
9 4 0  0   0  0  90  8   0   0 

Мне было трудно сделать то же самое в Р. Однако в Таблице это было просто прямо. Просто хотел знать, есть ли способ сделать то же самое в R эффективно.

ответ

3

Мы можем использовать dcast из data.table, который может принимать несколько value.var столбцов

library(data.table) 
dcast(setDT(df1), a+b ~paste0("Type_", Type_c), value.var = c("d", "e"), fill = 0) 
+1

Это замечательно. Я пытался с 'dcast' из' reshape', но я был нигде закрыт:/ – Sotos

+1

@akrun: Спасибо, это был отличный подход для работы. Проще и быстрее. – PD1

2

Другой вариант, возможно, используя spread из tidyr пакета

library(dplyr) 
library(tidyr) 
df1 %>% mutate(e1=Type_c) %>% spread(key = Type_c,value = d,fill = 0) %>% spread(key =e1,value = e,fill = 0) 

Я знаю, что это плохое решение, но все же это делает работа. Любое предложение относительно модификации кода приветствуется. Еще одна вещь, которую мы должны переименовать столбцы должным образом.

+1

Я бы использовал сбор 'gather/spread'' (df1, Var, Val, d: e)%>% unite (Varc, Var, Type_c)%>% spread (Varc, Val, fill = 0) ' – akrun