Как использовать цикл for для создания новой переменной на основе различий между posixct для файлов журнала - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь перебрать имеющийся у меня набор данных файла журнала, чтобы добавить переменную, в которой хранится номер сеанса сервера для каждого наблюдения.Для первой строки я хочу создать новую переменную 'номер сеанса' со значением 1. После этого я хочу другой номер сеанса для следующей строки, если 'ResearchNumber' отличается от строки ранее.Если это тот же «ResearchNumber», я хочу проверить, больше ли разница в переменной Posixct, чем 18000 секунд (или 30 минут).Если это так, я хочу создать другой номер сеанса (увеличив его на 1).Во всех остальных случаях я хочу, чтобы номер сеанса был таким же, как и в предыдущей строке.Подводя итог, я хочу создать номера сессий, основанные на бездействии более 30 минут для каждого участника.

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

Я надеюсь, что кто-то может помочь мне решить эту проблему.Вся помощь приветствуется!


# create example data

ResearchNumber <- c("AL001","AL002","AL003")

DateTimeTag <- c(
  as.POSIXct('2014-09-29 10:35:40', tz='GMT'),
  as.POSIXct('2014-09-29 10:35:42', tz='GMT'),
  as.POSIXct('2014-09-29 10:38:18', tz='GMT')
)

logdata <- data.frame(ResearchNumber, DateTimeTag)


# loop through logdata to add variable to every observation with a server session number

linecount <- 1
for (lines in logdata) {
  if (linecount == 1) {
    session_number <- 1
    logdata$session_number <- session_number
    datetime <- logdata$DateTimeTag
    participantbefore <- logdata$ResearchNumber
    linecount <- (linecount + 1)
  } 
  else if (linecount > 1) {
    difference <- (logdata$DateTimeTag - datetime)
    if (logdata$ResearchNumber != participantbefore) {
      logdata$session_number <- (session_number + 1)
      participantbefore <- logdata$ResearchNumber
      session_number <- (session_number + 1)
      datetime <- logdata$DateTimeTag
    }
    else if (difference > 18000) {
      logdata$session_number <- (session_number + 1)
      participantbefore <- logdata$ResearchNumber
      session_number <- (session_number + 1)
      datetime <- logdata$DateTimeTag
    }
    else {
      logdata$session_number <- (session_number)
      participantbefore <- logdata$ResearchNumber
      datetime <- logdata$DateTimeTag
    }
  }
}

1 Ответ

0 голосов
/ 25 июня 2019

Вы победили меня @docendo discimus!

Вот решение dplyr.

library(tidyverse) # brings in dplyr library

# make better example data
ResearchNumber <- c("AL001","AL002","AL003", "AL003", "AL003")

DateTimeTag <- c(
  as.POSIXct('2014-09-29 10:35:40', tz='GMT'),
  as.POSIXct('2014-09-29 10:35:42', tz='GMT'),
  as.POSIXct('2014-09-29 10:38:18', tz='GMT'),
  as.POSIXct('2014-09-29 12:00:00', tz='GMT'),
  as.POSIXct('2014-09-29 12:15:18', tz='GMT')
)

logdata <- data.frame(ResearchNumber, DateTimeTag)

logdata

logdata <- logdata %>% 
  arrange(ResearchNumber) %>% 
  group_by(ResearchNumber) %>% 
  mutate(difftime = difftime(DateTimeTag, lag(DateTimeTag), units = "mins"),
         DiffSess = case_when(
           is.na(difftime) ~ TRUE,
           difftime > 30 ~ TRUE,
           TRUE ~ FALSE)) %>% 
  ungroup() %>% 
  mutate(session_number = cumsum(DiffSess))

Результат

  ResearchNumber DateTimeTag         session_number difftime  DiffSess
  <fct>          <dttm>                       <int> <drtn>    <lgl>   
1 AL001          2014-09-29 10:35:40              1   NA mins TRUE    
2 AL002          2014-09-29 10:35:42              2   NA mins TRUE    
3 AL003          2014-09-29 10:38:18              3   NA mins TRUE    
4 AL003          2014-09-29 12:00:00              4 81.7 mins TRUE    
5 AL003          2014-09-29 12:15:18              4 15.3 mins FALSE  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...