Вычисление новой переменной на основе временных меток и групповой переменной с помощью R - PullRequest
0 голосов
/ 15 января 2020

У меня есть набор данных, содержащий непрерывные данные об эмоциональных реакциях субъектов на различные раздражители. Вы можете скачать пример файла данных здесь: https://www.dropbox.com/s/gvn27b6can2ka8s/example%20data.txt?dl=0.

Переменная стимула имеет 3 различных значения (NBL, EGR, KGR). Мне нужно разделить некоторые из этих значений (EGR и KGR) на три части, основываясь на информации о времени, стимуле и предмете. В итоге я хочу получить новую переменную стимула со значениями NBL, EGR_1, EGR_2, EGR3, KGR_1, KGR_2, KGR_3.

KGR_1
Начало: Первая строка, содержащая KGR для каждого значения «субъекта»
Концы: 304 секунды после первой строки KGR

KGR_2
Начало: Первая строка после последняя строка KGR_1
Концы: 90 секунд после первой строки KGR_2

KGR_3
Начало: Первая строка после последней строки KGR_2
Концы: Последняя строка, содержащая KGR для каждого значения «subject "

EGR_1
Начинается: первая строка, содержащая EGR для каждого значения" субъекта "
Концы: 304 секунды после первого ряда EGR

EGR_2
Начинается: Первая строка после последней строки EGR_1
Концы: 91 секунда после первой строки EGR_2

EGR_3
Начало: Первая строка после последней строки EGR_2
Концы: последняя строка, содержащая EGR для каждого значения « subject "

Я подошел к проблеме с этим кодом:

exampledata <- exampledata %>%
  mutate(time = as.POSIXct(strptime(substr(time, 1, 8), "%H:%M:%S"))) %>% 
  group_by(subject) %>% 
  mutate(dt_secs =  as.numeric(difftime(time, lag(time), units = 'secs'))) %>% 
  tidyr::replace_na(list(dt_secs = 0)) %>% 
  group_by(subject, stimulus) %>% 
  mutate(cum_time = cumsum(dt_secs),
     is_first_for_event = cum_time == min(cum_time),
     is_last_for_event = cum_time == max(cum_time),
     KGR_1_end = (stimulus == "KGR") & (cum_time == 304),
     KGR_2_start = (stimulus == "KGR") & (cum_time == 305),
     KGR_2_end = (stimulus == "KGR") & (cum_time == 394),
     KGR_3_start = (stimulus == "KGR") & (cum_time == 395),
     EGR_1_end = (stimulus == "EGR") & (cum_time == 304),
     EGR_2_start = (stimulus == "EGR") & (cum_time == 305),
     EGR_2_end = (stimulus == "EGR") & (cum_time == 395),
     EGR_3_start = (stimulus == "EGR") & (cum_time == 396))

Проблема в том, что, поскольку у меня есть 7-8 кадров в секунду анализа, набор данных имеет несколько строк данных в секунду , так что это не совсем работает. Я пытался приспособить это, используя миллисекунды как единицы вместо секунд, но безуспешно. Возможно, этот подход очень хорош, в этом случае я не знаю, как продолжить то, что я получаю (множественные значения TRUE), пытаясь вычислить эту новую переменную.

R и кодирование вообще для меня действительно ново.

1 Ответ

0 голосов
/ 15 января 2020

Я не совсем уверен, что вы пытаетесь сделать, вы создаете все виды переменных (например, is_first_for_event), из которых неясно, как они связаны с вашим вопросом, чтобы вычислить новую переменную стимула.

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

exampledata <- exampledata %>%
  arrange(time) %>% 
  mutate(time = as.POSIXct(strptime(substr(time, 1, 8), "%H:%M:%S"))) %>% 
  group_by(subject) %>% 
  mutate(dt_secs =  as.numeric(difftime(time, lag(time), units = 'secs'))) %>% 
  tidyr::replace_na(list(dt_secs = 0)) %>% 
  group_by(subject, stimulus) %>% 
  mutate(cum_time = cumsum(dt_secs) ,
         new_stimulus_var = case_when(
           stimulus == "KGR" & cum_time < 304 ~ "KGR_1",
           stimulus == "KGR" & cum_time < 394 ~ "KGR_2",
           stimulus == "KGR" & cum_time >= 394 ~ "KGR_3",
           stimulus == "EGR" & cum_time < 304 ~ "EGR_1",
           stimulus == "EGR" & cum_time < 395 ~ "EGR_2",
           stimulus == "EGR" & cum_time >= 395 ~ "EGR_3",
           TRUE ~ NA_character_ 
         )) 

, что приведет к:

time                Neutral     Happy   Sad  Angry Surprised   Scared Disgusted Contempt stimulus subject dt_secs cum_time new_stimulus_var
   <dttm>                <dbl>     <dbl> <dbl>  <dbl>     <dbl>    <dbl>     <dbl>    <dbl> <chr>    <chr>     <dbl>    <dbl> <chr>           
 1 2020-01-15 00:18:02   0.171 0.0000511 0.885 0.0625  0.000939 0.000170   0.00383 0        EGR      VP24          0        0 EGR_1           
 2 2020-01-15 00:18:02   0.163 0.0000461 0.893 0.0592  0.000864 0.000173   0.00374 0        EGR      VP24          0        0 EGR_1           
 3 2020-01-15 00:18:02   0.176 0.0000422 0.883 0.0633  0.000788 0.000171   0.00374 0.000355 EGR      VP24          0        0 EGR_1           
 4 2020-01-15 00:18:02   0.206 0.0000428 0.862 0.0728  0.000714 0.000212   0.00357 0.000238 EGR      VP24          0        0 EGR_1           
 5 2020-01-15 00:18:02   0.236 0.0000450 0.851 0.0723  0.000612 0.000246   0.00343 0.000488 EGR      VP24          0        0 EGR_1           
 6 2020-01-15 00:18:02   0.236 0.0000435 0.855 0.0674  0.000502 0.000269   0.00320 0.00416  EGR      VP24          0        0 EGR_1           
 7 2020-01-15 00:18:02   0.206 0.0000671 0.875 0.0566  0.000428 0.000283   0.00428 0.00528  EGR      VP24          0        0 EGR_1           
 8 2020-01-15 00:18:03   0.171 0.0000850 0.897 0.0450  0.000405 0.000775   0.00880 0.00463  EGR      VP24          1        1 EGR_1           
 9 2020-01-15 00:18:03   0.137 0.0000848 0.919 0.0350  0.000370 0.000875   0.0104  0.00495  EGR      VP24          0        1 EGR_1           
10 2020-01-15 00:18:03   0.165 0.0000933 0.930 0.0274  0.000410 0.00107    0.00980 0.0141   EGR      VP24          0        1 EGR_1  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...