Как создать вектор длительности из кадра данных? - PullRequest
0 голосов
/ 17 июня 2019

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

Например: оригинальный кадр данных

Time    Subject  Behavior  Status
11.901  M        FOR       START
20.896  M        FOR       STOP
20.897  M        NI        START
22.646  M        NI        STOP
22.647  M        FOR       START
26.898  M        TSp       POINT
29.146  M        FOR       STOP
29.147  M        NI        START
30.646  M        NI        STOP
30.647  M        FOR       START
32.148  M        TSp       POINT
39.397  M        FOR       STOP
39.398  M        NI        START
43.647  M        NI        STOP
43.648  M        FOR       START
48.647  M        FOR       STOP
48.648  M        NI        START
51.147  M        NI        STOP
51.148  M        FOR       START
52.088  M        TSp       POINT
54.585  M        FOR       STOP
54.586  M        NI        START
61.334  M        NI        STOP
61.335  M        FOR       START
65.084  M        FOR       STOP
65.085  M        NI        START
66.878  M        NI        STOP

=> что я хочу: продолжительность: (8,995, 1,749, 4,251, 1, 1,248, ....)

Проблемы, с которыми я сталкиваюсь: Различение и сопряжение начала и конца разного поведения в коде. Кроме того, поведение, имеющее «точку» в строке «статус», трудно включить, поскольку мы не можем рассчитать длительность, рассчитанную по фрейму данных. Я хотел бы считать это 1 сек, но это означает, что это:

22.647  M    FOR       START     
26.898  M    TSp       POINT  
29.146  M    FOR       STOP   

должно быть преобразовано в это:

22.647  M       FOR      START
26.897  M       FOR      STOP
26.898  M       TSp      START 
27.898  M       TSp      STOP
27.899  M       FOR      START
29.146  M       FOR      STOP

Это то, что я рассчитал в примере.

Это действительно раздражает, потому что у меня есть другое "поведение точечного события", и если нам нужно все преобразовать, это будет беспорядок. Если мы не можем добавить это довольно легко, я предпочитаю, чтобы мы не считали надлежащую длительность, но мне все еще нужно, чтобы это появилось в векторе продолжительности.

Заранее благодарю за помощь, я все еще не очень хорошо понимаю, как разговаривать с Р ..

1 Ответ

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

Я полагаю, что следующий код - то, о чем спрашивает вопрос.
Сначала он создает фрейм данных с удаленным Status == 'POINT' в соответствии с правилами в вопросе. Затем вызывает другую функцию для вычисления вектора длительностей.

removePOINT <- function(DF){
  while(any(DF[['Status']] == 'POINT')){
    n <- nrow(DF)
    i <- min(which(DF[['Status']] == 'POINT'))
    Tm <- DF[i, 'Time']
    Time <- c(Tm - 0.001, Tm, Tm + 1, Tm + 1.001)
    Subject <- rep(DF[i, 'Subject'], 4)
    Behavior <- rep(DF[i, 'Behavior'], 4)
    Status <- rep(c('STOP', 'START'), 2)
    tmp <- data.frame(Time, Subject, Behavior, Status)
    DF <- rbind(DF[1:(i - 1), ], tmp, DF[(i + 1): n, ])
  }
  DF
}
computeDuration <- function(DF){
  grp <- cumsum(DF[['Status']] == "START")
  agg <- aggregate(Time ~ grp, DF, function(x) {
    duration <- x[length(x)] - x[1]
  })
  subtr <- tapply(grp, grp, function(x) if(length(x) > 2) -1 else 0)
  agg[['Time']] <- agg[['Time']] + subtr
  agg[['Time']]
}

df2 <- removePOINT(df1)
computeDuration(df2)
# [1] 8.995 1.749 4.250 1.000 1.247 1.499 1.500 1.000 6.248 4.249 4.999
#[12] 2.499 0.939 1.000 1.496 6.748 3.749 1.793

Финальная уборка.

rm(df2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...