Как продублировать строки в R и добавить новые данные? - PullRequest
0 голосов
/ 31 мая 2018

У меня есть data.table с метками времени, в которых есть время и время для людей, округленное до ближайших 15-минутных интервалов.Я хочу иметь возможность дублировать каждую строку, чтобы иметь то же количество копий, что и количество 15-минутных интервалов, охватываемых данными времени / времени ожидания, при добавлении нового столбца, в котором перечислены 15-минутные интервалы (например, для человекав 10:00 и в 11:00 будет четыре ряда: один со временем 10:00, второй - 10:30, один - 10:30 и 10:45).

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Это на самом деле просто очень простое применение транспонирования и переноса последнего наблюдения.

Вот мой сотрудник:

emp <- data.frame(empid = 001, timein = as.POSIXct('2018-05-31 8:00'), timeout = as.POSIXct('2018-05-31 17:00'))

Вот мой перенос, перенесенный из последнего наблюдения (ноесть также zoo::na.locf)

locf <- function(y) c(NA, na.omit(y))[cumsum(!is.na(y))+1]

Теперь транспонировать:

emplong <- reshape(emp, direction='long', idvar='empid', varying=list(2:3), 
  times=c('in', 'out'), timevar='status')

Это дает:

      empid status              timein
1.in      1     in 2018-05-31 08:00:00
1.out     1    out 2018-05-31 17:00:00

Теперь создайте список:

roster <- data.frame('times' = seq(
  from=as.POSIXct('2018-05-31 00:00:00'),
  to=as.POSIXct('2018-06-01 00:00:00'),
  by=15*60))

И объединить

roster <- merge(roster, emplong[, -1], by.x='times', by.x='timein', all=T)

И LOCF

roster$status <- locf(roster$status )
roster$status[is.na(roster$status )] <- 'out'

Это дает:

> roster
                 times status
1  2018-05-31 00:00:00    out
2  2018-05-31 00:15:00    out
3  2018-05-31 00:30:00    out
4  2018-05-31 00:45:00    out
5  2018-05-31 01:00:00    out
...
31 2018-05-31 07:30:00    out
32 2018-05-31 07:45:00    out
33 2018-05-31 08:00:00     in
34 2018-05-31 08:15:00     in
...
67 2018-05-31 16:30:00     in
68 2018-05-31 16:45:00     in
69 2018-05-31 17:00:00    out
70 2018-05-31 17:15:00    out
0 голосов
/ 31 мая 2018

Для решения data.table при условии, что ваш data.table отформатирован следующим образом:

library(data.table)

dt <- data.table(
  employee = c("John", "Paul", "Mary"),
  clock.in = as.POSIXct(c("10:30", "12:30", "13:15"), format = "%R"),
  clock.out = as.POSIXct(c("11:00", "13:15", "14:15"), format = "%R")
                 )

> dt
   employee            clock.in           clock.out
1:     John 2018-05-31 10:30:00 2018-05-31 11:00:00
2:     Mary 2018-05-31 13:15:00 2018-05-31 14:15:00
3:     Paul 2018-05-31 12:30:00 2018-05-31 13:15:00

Используйте setkey, чтобы разрешить объединение между базовой таблицей и таблицей с интервалом 15 минут.последовательность создается между часами входа и выхода:

setkey(dt, employee)

> dt[dt[, seq.POSIXt(clock.in, clock.out, by = 60*15), by = employee]]
    employee            clock.in           clock.out                  V1
 1:     John 2018-05-31 10:30:00 2018-05-31 11:00:00 2018-05-31 10:30:00
 2:     John 2018-05-31 10:30:00 2018-05-31 11:00:00 2018-05-31 10:45:00
 3:     John 2018-05-31 10:30:00 2018-05-31 11:00:00 2018-05-31 11:00:00
 4:     Mary 2018-05-31 13:15:00 2018-05-31 14:15:00 2018-05-31 13:15:00
 5:     Mary 2018-05-31 13:15:00 2018-05-31 14:15:00 2018-05-31 13:30:00
 6:     Mary 2018-05-31 13:15:00 2018-05-31 14:15:00 2018-05-31 13:45:00
 7:     Mary 2018-05-31 13:15:00 2018-05-31 14:15:00 2018-05-31 14:00:00
 8:     Mary 2018-05-31 13:15:00 2018-05-31 14:15:00 2018-05-31 14:15:00
 9:     Paul 2018-05-31 12:30:00 2018-05-31 13:15:00 2018-05-31 12:30:00
10:     Paul 2018-05-31 12:30:00 2018-05-31 13:15:00 2018-05-31 12:45:00
11:     Paul 2018-05-31 12:30:00 2018-05-31 13:15:00 2018-05-31 13:00:00
12:     Paul 2018-05-31 12:30:00 2018-05-31 13:15:00 2018-05-31 13:15:00
0 голосов
/ 31 мая 2018

Я понятия не имею, как выглядят ваши данные, но вот мой лучший снимок.

library(padr)
library(zoo)

#data
user<-"4"
times<-c("10:00","11:15")
times<-as.POSIXct(times,format="%H:%M")

#create df
dt<-data.frame(user,times)

> dt
  user               times
1    4 2018-05-31 10:00:00
2    4 2018-05-31 11:15:00

#make correct intervals
dt<-pad(dt, interval="15 min")

#carry user id forward
dt<-na.locf(dt)

>dt

  user               times
1    4 2018-05-31 10:00:00
2    4 2018-05-31 10:15:00
3    4 2018-05-31 10:30:00
4    4 2018-05-31 10:45:00
5    4 2018-05-31 11:00:00
6    4 2018-05-31 11:15:00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...