2016-03-21 2 views
1

Я видел довольно много сообщений, где формат данных трансформируется из широкого в длинный. Хотя мой вопрос немного сложнее. Я получил dataframe так:Как разбить диапазон на мелкие детали и преобразовать его из широкого формата в длинный?

id Start_time_of_conversation End_time_of_conversation Participant1 Participant2 
id1  07:00      08:00      A   B 
id2  07:00      09:00      C   D 

Я хотел бы преобразовать эту dataframe в нечто вроде этого:

id time(in min) dataName  dataValue 
id1 07:00  Participant1  A 
id1 07:00  Participant2  B 
id2 07:00  Participant1  C 
id2 07:00  Participant2  D 
id1 07:01  Participant1  A 
id1 07:01  Participant2  B 
id2 07:01  Participant1  C 
id2 07:01  Participant2  D 
... 
id1 08:59  Participant1  A 
id1 08:59  Participant2  B 
id1 09:00  Participant1  A 
id1 09:00  Participant2  B 

Так что не только изменить его на длинный формат, но и генерировать новую строку (две строки с 2 участниками) для каждой минуты между временным диапазоном Start_time_of_conversation и End_time_of_conversation.

Я думал, что, возможно, я должен использовать seq() и melt(), чтобы сделать это, хотя я действительно не вижу, как я мог это сделать без большого количества лоскутной игры. Должен ли я создать первый длинный формат и преобразовать каждый диапазон/строку в последовательность минут или есть ли более простой способ сделать это?

ответ

1

Один вариант будет использовать data.table. Преобразуйте «data.frame» в «data.table» (setDT(df1), сгруппированные по «id», «Участник1» и «Участник2», получаем последовательность столбцов «Datetime» (после преобразования в класс POSIXlt с strptime).

library(data.table) 
DT <- setDT(df1)[, 
    list(time_in_mins =format(seq(strptime(Start_time_of_conversation, 
    format="%H:%M"), 
    strptime(End_time_of_conversation, format="%H:%M"), by = "1 min"), 
     "%H:%M")) , .(id,Participant1, Participant2)] 

Используя приведенный выше вывод, что мы делаем melt для преобразования столбцов 'Участника в формате «длинных» и order при необходимости.

melt(DT, id.var=c("id", "time_in_mins"), 
    variable.name= "dataName", 
    value.name= "dataValue")[order(time_in_mins, id, dataName)] 
#  id time_in_mins  dataName dataValue 
# 1: id1  07:00 Participant1   A 
# 2: id1  07:00 Participant2   B 
# 3: id2  07:00 Participant1   C 
# 4: id2  07:00 Participant2   D 
# 5: id1  07:01 Participant1   A 
# ---           
#360: id2  08:58 Participant2   D 
#361: id2  08:59 Participant1   C 
#362: id2  08:59 Participant2   D 
#363: id2  09:00 Participant1   C 
#364: id2  09:00 Participant2   D 
+0

Спасибо! Я просто забыл упомянуть, что я могу не загружать пакет data.table, потому что в системе, где он должен запускаться, этого пакета не будет. Я могу использовать ggplot и plyr над базовыми командами. У вас есть какие-то предложения? – user5918250

Смежные вопросы