2015-12-08 4 views
1

У меня есть широкий dataframe, который выглядит примерно так:R: изменения формы шириной до тех пор

ID Time Amount  CabMean CabNum  PartMean PartNum  DinnMean DinNum Ex 
1 1 1 27 0.654621546  8   NA  7 0.316791872  6 0 
2 1 2 82 0.667461321  3 0.327594876  4 0.346798127  2 1 
3 1 3 52 0.313976132  1   NA  6 0.197837257  7 0 
4 1 4 99 0.798328712  9 0.913751678  4 0.191679538  9 1 

Я хотел бы изменить форму (с использованием пакета reshape2) его в длинном формате, который принимает эту форму (только что делает эти цифры вверх):

ID Time Amount Ex Type Mean   Num 
1 1 2 50 0 Cab 0.65654321 7 
2 1 2 50 0 Part 0.65654321 1 
3 1 2 50 0 Dinn 0.65654321 4 

Я пытался что-то вроде этого:

reshaped <- melt(data, id.vars = c("ID", "Time", "Amount", "Ex")) 

Что заставляет меня что-то вроде т его:

ID Time Amount Ex variable value 
1 1 1 10 0 CabMean 0.6565432 
2 1 2 12 0 CabMean 0.6565432 

Так что я всего лишь на полпути и не могу понять все остальное. Как я (либо из кода, который я использую в настоящее время, либо из совершенно нового кода) извлекает тип (Cab, Part, Dinn) в качестве отдельного столбца и создает 2 дополнительных столбца, которые содержат значения «Среднее» и «Нет»?

+0

Base 'reshape' тоже можете это сделать:' перекроить (Дат, idvar = C ("ID", "Время"), направление = "длинный", варьируя = список (с (4,6,8), c (5,7,9)), times = c ("cab", "part", "dinn")) ' – thelatemail

ответ

2

Мы можем использовать melt от data.table, который может принимать несколько столбцов measure с аргументом pattern. Мы преобразуем «data.frame» в «data.table» (setDT(data)), затем melt10 в «длинный» формат.

library(data.table) 
DT <- melt(setDT(data), measure=patterns('Mean$', 'Num$'), 
       variable.name='Type', value.name=c('Mean', 'Num')) 
DT[, Type:=c('Cab', 'Part', 'Dinn')[Type]] 
+0

Как бы вы переименовали значения в столбце Type в правильную метку из заголовка ? – Simon

+1

@Simon Вы можете «gsub» от имен столбцов и использовать индикатор «Тип» или использовать его напрямую. Я обновил сообщение. – akrun