2017-01-18 11 views
0

У меня есть следующий dataframe.Группа по последовательности или последовательности в R

enter image description here

Как было предложено много пользователей я делюсь этим с dput.

> dput(time_interval_df) 
structure(list(timeinterval = structure(1:24, .Label = c("00:00:00 00:59:59", 
"01:00:00 01:59:59", "02:00:00 02:59:59", "03:00:00 03:59:59", 
"04:00:00 04:59:59", "05:00:00 05:59:59", "06:00:00 06:59:59", 
"07:00:00 07:59:59", "08:00:00 08:59:59", "09:00:00 09:59:59", 
"10:00:00 10:59:59", "11:00:00 11:59:59", "12:00:00 12:59:59", 
"13:00:00 13:59:59", "14:00:00 14:59:59", "15:00:00 15:59:59", 
"16:00:00 16:59:59", "17:00:00 17:59:59", "18:00:00 18:59:59", 
"19:00:00 19:59:59", "20:00:00 20:59:59", "21:00:00 21:59:59", 
"22:00:00 22:59:59", "23:00:00 23:59:59"), class = "factor"), 
    timecount = c(1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 
    0, 0, 0, 0, 1, 0, 1, 1, 1)), .Names = c("timeinterval", "timecount" 
), row.names = c(NA, -24L), class = "data.frame") 

Структура моего dataframe является

str(time_interval_df) 
'data.frame': 24 obs. of 2 variables: 
$ timeinterval: Factor w/ 24 levels "00:00:00 00:59:59",..: 1 2 3 4 5 6 7 8 9 10 ... 
$ timecount : num 1 1 1 0 0 0 0 0 1 1 ... 

Если разница между TimeInterval является 1, и есть некоторое время рассчитывать, то я хочу, чтобы сгруппировать их в одной группе .Дль например, разность б/w строка № 1 и строка № 2 равна 1, а также разница b/w row2 и row3 (последовательно) равна 1, поэтому я хочу сгруппировать все в один и отобразить сумму timecount перед новой строкой, то есть «00:00: 00 02:59:59 " Ниже мой желаемый результат

enter image description here

После того, как второй выход мой второй желаемый результат будет

enter image description here

Пожалуйста, помогите мне в этом. Я потратил на это много времени.

+1

Разве это не похоже на тот, который вы публикуемую [здесь] (http://stackoverflow.com/questions/41690295/group-by-series-or-sequence-in-r/41690555#41690555) – akrun

+1

@akrun да, но предоставленное вами решение не помогло, и мой вопрос было несколько неясным. Можете ли вы, пожалуйста, помочь еще раз? – user110244

+1

Я удалил предыдущий пост из-за большого количества отрицательных голосов, так как он не был воспроизводимым. Можете ли вы поделиться своим полным кодом. Лучше, если вы разделите его, настроив данные по моим данным. Спасибо – user110244

ответ

2

Мы можем использовать data.table. Преобразуйте 'data.frame' в 'data.table' (setDT(df1). Создайте два столбца («time1», «time2»), разделив «timeinterval» (tstrsplit()) в пробеле, сгруппированный по идентификатору длины строки «timecount», ifall значения «timecount» не равны 0, затем paste первый (1) и последний (.N) элементов «time1» и «time2» соответственно, а также получите число или строки (.N). В случае необходимости, назначить «GRP» столбец «NULL»

library(data.table) 
res1 <- setDT(df1)[, c('time1', 'time2') := tstrsplit(timeinterval, " ") 
    ][, if(all(timecount!=0)) .(timeinterval= paste(time1[1], time2[.N]), timecount = .N), 
      .(grp = rleid(timecount))][, grp := NULL][] 
res1 
#  timeinterval timecount 
#1: 00:00:00 02:59:59   3 
#2: 08:00:00 09:59:59   2 
#3: 14:00:00 14:59:59   1 
#4: 19:00:00 19:59:59   1 
#5: 21:00:00 23:59:59   3 

С «res1», мы можем подвести итог, чтобы получить «res2»

rbind(res1[c(1, .N)][, .(timeinterval = paste(substr(timeinterval[.N], 
    1, 8), substring(timeinterval[1], 10)), timecount= sum(timecount))], res1[-c(1, .N)]) 
#  timeinterval timecount 
#1: 21:00:00 02:59:59   6 
#2: 08:00:00 09:59:59   2 
#3: 14:00:00 14:59:59   1 
#4: 19:00:00 19:59:59   1 
+0

большое спасибо. Путаница заключается в том, как разделить интервал времени? можете ли вы на нее наложить некоторый свет? – user110244

+1

@ user110244 Я использовал 'tstrsplit' для этого. Если вы согласны с решением, пожалуйста, также проверьте [здесь] (http://stackoverflow.com/help/someone-answers) – akrun

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