Как я могу найти последующее испытание в зависимости от состояния? - PullRequest
0 голосов
/ 21 декабря 2018

Я использую R для манипулирования большим набором данных (набором данных), который состоит из 20 000+ строк.В моих данных у меня есть три важных столбца для этого вопроса: Trial_Nr (состоит из 90 испытаний), секунд (увеличение с шагом в 0,02 секунды) и угрозы (фиксация к угрозе: 1 = да, 0 = нет, нет данных).В рамках каждого испытания мне нужно ответить, когда они изначально фиксируются на угрозе (1), сколько времени потребуется им, чтобы не зацикливаться на угрозе (0).Таким образом, в основном, в каждом испытании мне нужно было бы найти первую угрозу = 1 и последующую угрозу = 0 и вычесть время.Я могу получить первую угрозу с помощью этого кода:

initalfixthreat <- dataset %>%
                   group_by(Trial_Nr) %>%
                  slice(which(threat == '1')[1])

Я не знаю, как получить последующую угрозу = 0 в этом пробном номере.

Вот примерданные (извините, не знаю, как лучше отформатировать их):

enter image description here

Так что для Trial_Nr = 1 мне было бы интересно 689,9 секунд - 689,8,Для Trial_Nr = 2 я бы хотел 690,04-689,96.

Пожалуйста, дайте мне знать, если мне неясно, и спасибо всем за помощь!

1 Ответ

0 голосов
/ 21 декабря 2018

Один из подходов:

library(dplyr)

df %>%
  group_by(Trial_Nr) %>%
  filter(!is.na(threat)) %>%
  mutate(flag = ifelse(threat == 1, 1, threat - lag(threat))) %>% 
  filter(abs(flag) == 1 & !duplicated(flag)) %>%
  summarise(timediff = ifelse(length(seconds) == 1, NA, diff(seconds)))

# A tibble: 2 x 2
  Trial_Nr timediff
     <int>  <dbl>
1        1 0.1   
2        2 0.0800

Данные:

df <- structure(list(Trial_Nr = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L), seconds = c(689.76, 689.78, 689.8, 689.82, 
689.84, 689.86, 689.88, 689.9, 689.92, 689.94, 689.96, 689.98, 
690, 690.02, 690.04), threat = c(0L, 0L, 1L, 1L, 1L, NA, NA, 
0L, 1L, 0L, 1L, NA, NA, 1L, 0L)), class = "data.frame", row.names = c(NA, 
-15L))
...