У меня есть датафрейм, который выглядит следующим образом:
Воспроизводимые данные:
structure(list(User = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "Jibran", class = "factor"),
Event = structure(c(1L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 2L, 2L,
1L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("IN",
"OUT"), class = "factor"), Time = c("04/15/2015 00:31", "04/16/2015 20:10",
"04/21/2015 14:59", "04/22/2015 01:01", "04/22/2015 10:46",
"04/23/2015 00:58", "04/23/2015 14:50", "04/24/2015 01:37",
"04/25/2015 01:01", "04/27/2015 00:57", "04/17/2015 10:32",
"04/29/2015 15:03", "05/01/2015 00:44", "05/02/2015 01:19",
"05/02/2015 15:08", "05/03/2015 01:08", "05/03/2015 15:06",
"05/04/2015 01:01", "05/04/2015 15:11", "05/05/2015 01:08"
)), row.names = c(NA, -20L), class = "data.frame")
![enter image description here](https://i.stack.imgur.com/URKR0.png)
Я ищу значения, в которых изменяется событие, например:
Пользователь |Событие |Время
Jibran IN 21.04.2015 14:59 Jibran OUT 4/22/2015 1:01 .. .. Значения, которые возникают, когда следующее событие отличается (имеют значения только в том случае, если за событием следует In, а затемOut)
Способ решения этой проблемы:
x = read.csv("TimeLog2.csv",header=TRUE)
df <- data.frame(matrix(ncol = 3, nrow = 0))
names(df)[1]<-paste("UserName")
names(df)[2]<-paste("Login")
names(df)[3]<-paste("Logout")
for(i in 1:length(x$Event))
{
if(x$Event[[i]]== 'IN' && x$Event[[i+1]]== 'OUT'){
df$Login[[i]]<-(x$Time[[i]])
df$Logout[[i]]<-(x$Time[[i+1]])
}
}
, который возвращает:
Ошибка в $<-.data.frame
(*tmp*
, «Login», значение =c (NA, NA, 4L)): замена имеет 3 строки, данные имеют 0
Требуемый результат должен выглядеть следующим образом:
![enter image description here](https://i.stack.imgur.com/hMsjW.png)
Необходимо убедиться, что изменение в событии должно быть записано только в следующий кадр данных, только если оно происходит в тот же или на следующий день (согласно дате), чтобы получить точные значения входа / выхода из системы.