Разница в переменной между одной обервацией для субъекта и следующей (R) - PullRequest
0 голосов
/ 22 ноября 2018

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

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

Пример набора данных:

game_data <- data.frame(player = c(1,1,1,1,2,2,2,2), level = c(1,1,2,2,1,1,2,2), activity = c("run","run","run","swim","swim","run","run","swim"), datesec = c(0,150,170,240,100,110,180,330))
> game_data
  player level activity datesec
1      1     1      run       0
2      1     1      run     150
3      1     2      run     170
4      1     2     swim     240
5      2     1     swim     100
6      2     1      run     110
7      2     2      run     180
8      2     2     swim     330

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

Это должно выглядеть так:

game_data_new <- data.frame(player = c(1,1,2,2), level = c(1,2,1,2), n_run = c(2,1,1,1), n_swim = c(0,1,1,1), timeafterrun = c(170,70,70,150))
> game_data_new
  player level n_run n_swim timeafterrun
1      1     1     2      0          170
2      1     2     1      1           70
3      2     1     1      1           70
4      2     2     1      1          150

170 в переменной "timeafterrun", например, вычисляется как (150-0) + (170-150) Здесь код должен выполнить первое наблюдение следующего уровня, уровня 2, потому что в уровне 1 больше нет действий.

Я пробовалниже, но я не знаю, что добавить к коду, чтобы сказать R, что он должен принимать разницу в datesec между следующим оберверсацией после «run» (даже на следующем уровне) и фактическим «run».

game <- game %>%
  group_by(player,level) %>%
  summarize(
    n_run = sum(type == "run"),
    n_swim = sum(type == "swim"),
    timeafterrun = datesec(datesec of activity after_last_"run"-obervation) - datesec(actual_"run"-observation) 
  )

1 Ответ

0 голосов
/ 22 ноября 2018
require(dplyr)
game_data %>% 
  group_by(player) %>% 
  mutate(nextdat=lead(datesec)) %>% 
  group_by(level, add=TRUE) %>% 
  mutate(timeafterrun=max(nextdat,na.rm=TRUE)-min(datesec[activity=="run"],na.rm = TRUE)) %>%
  summarize(n_run=sum(activity=="run"),n_swim=sum(activity=="swim"), timeafterrun=max(timeafterrun))

# A tibble: 4 x 5
# Groups:   player [?]
  player level n_run n_swim timeafterrun
   <dbl> <dbl> <int>  <int>        <dbl>
1      1     1     2      0          170
2      1     2     1      1           70
3      2     1     1      1           70
4      2     2     1      1          150

Вот что происходит: сначала я создаю вспомогательный столбец со следующей (lead) датсек для каждой строки (в пределах отдельного игрока).

Далее я group_by оба игрокаи уровень, и создайте столбец, который вычитает наименьший datesec для строк с activity=="run" из наибольшего datesec в группе.

Затем I summarize для создания n_run и n_swim и копирования через timeafterrun, который долженбыть одинаковым для всей группы, поэтому я произвольно выбрал max, но это не имеет значения.

...