Использование операторов if else для создания гибкой формулы, которая может корректироваться в зависимости от предъявляемых стимулов.

Я надеюсь, что все хорошо. Недавно я разработал код (с помощью замечательного сообщества переполнения стека), чтобы рассчитать время до первой фиксации, продолжительность первой фиксации и общую продолжительность посещения интересующих областей. Теперь я хочу обновить его, чтобы он мог корректироваться в зависимости от предъявляемых стимулов. В частности, координаты x и y очень незначительно различаются между каждым стимулом. У меня есть пример электронной таблицы координат стимулов. Было бы здорово, если бы я мог прочитать их. Сопоставить их со стимулами в данных Final_Label и иметь возможность рассчитать и обобщить эти показатели по всем испытаниям. Поэтому мне нужно что-то в коде, которое по существу говорит - если это стимулы (например, A1 использует эти координаты и т. д.).

Спасибо за вашу помощь и, пожалуйста, дайте мне знать, если я могу предоставить дополнительную информацию в это время.

Берегите себя и будьте здоровы,

Кэролайн

Face_AOI <- Final_Labels %>%
    mutate(AOI_face = (mean_x >= .100 & mean_x <= .500 & mean_y >= .100 & mean_y <= .800), #These numbers are FAKE ###) %>%
    filter(AOI_face) %>%
    group_by(SubjectID, Trial) %>%
    summarize(Face_totalfixationduration = sum(Duration), Face_firstfixationduration = first(Duration), Face_timetofirstfixation = first(Start))
  
  
  Mouth_AOI <- Final_Labels %>%
    mutate(AOI_mouth = (mean_x >= .200 & mean_x <= .300 & mean_y >= .500 & mean_y <= .600)) %>%
    filter(AOI_mouth) %>%
    group_by(SubjectID, Trial) %>%
    summarize(Mouth_totalfixationduration = sum(Duration), Mouth_firstfixationduration = first(Duration), Mouth_timetofirstfixation = first(Start))
  
  Mouth_AOI$SubjectID <- NULL
  
  Eyes_AOI <- Final_Labels %>%
    mutate(
           AOI_eyes = (mean_x >= .200 & mean_x <= .300 & mean_y >= .500 & mean_y <= .600)) %>%
    filter(AOI_eyes) %>%
    group_by(SubjectID, Trial) %>%
    summarize(Eyes_totalfixationduration = sum(Duration), Eyes_firstfixationduration = first(Duration), Eyes_timetofirstfixation = first(Start))
  

Пример списка стимулов с разными координатами для интеграции в приведенный выше код.


Df2 <- data.frame(Stimuli = c("A1", "A1", "A1", "A2", "A2", "A2"),
AOI = C("Face", "Eyes", "Mouth", "Face", "Eyes", "Mouth"),
X1 = c(0, 300, 301, 0, 305, 306),
X2 = c(1022, 600, 600, 0, 604, 604),
Y1 = c(0, 30, 31, 0, 30, 38),
Y2 = c(0, 300, 301, 6, 305, 306))

Вот пример кадра данных Final_Labels

Final_Labels <- data.frame(Stimuli = c("A1.jpg", "A2.jpg", "A3.jpg", "A4.jpg", "A5.jpg", "H1.jpg"), ##note we will need .jpg to be removed to match the files
Duration = c(300, NA, 300, 60, NA, NA),
Start = c(100, NA, 1, 100, NA, NA),
End = c(160, NA, 301, 160, NA, NA),
mean_x = c(.3, NA, .50, .40, NA, NA),
mean_y = c(.5, NA, .4, .5, NA, NA))

person Caroline    schedule 29.10.2020    source источник
comment
Спасибо, что указали на это. Я отредактировал сообщение, и теперь это должно быть исправлено.   -  person Caroline    schedule 30.10.2020
comment
Хорошо, я вернулся, чтобы посмотреть на это, и я немного сбит с толку вашей целью. У меня нет примера того, как выглядит Final_Label, поэтому я не очень понимаю, с чего вы начинаете. Сопоставление вашего Df2 с Final_Label, вероятно, означает соединение какого-либо типа - вы можете увидеть часто задаваемые вопросы Как соединить (объединить) данные в R?.   -  person Gregor Thomas    schedule 02.11.2020
comment
Если вы предоставите образец Final_Label, а также немного более точное описание того, как вы хотите их объединить, я могу попробовать. (Желаемый выходной сигнал, соответствующий вашему образцу ввода, будет полезен)   -  person Gregor Thomas    schedule 02.11.2020
comment
Последнее замечание: все X1, X2, Y1, Y2, которые вы предоставляете, относятся к классу character, а не числовым (из-за кавычек вокруг них). Это преднамеренно? Если вы хотите использовать их как числа, вероятно, первым шагом будет преобразование их всех в числовые.   -  person Gregor Thomas    schedule 02.11.2020
comment
Привет, Грегор, спасибо за вашу постоянную помощь. Это действительно ценится. Теперь я добавил пример фрейма данных Final_Labels. Что касается вашего вопроса, X1, X2, Y1, Y2 уже являются числовыми - я удалил кавычки, чтобы лучше отразить это.   -  person Caroline    schedule 03.11.2020


Ответы (1)


Вот код для удаления .jpg и соединения на основе значений Stimuli.

library(dplyr)
library(stringr)
Final_Labels %>%
  mutate(Stimuli = str_remove(Stimuli, fixed(".jpg"))) %>%
  full_join(Df2)
#    Stimuli Duration Start End mean_x mean_y   AOI  X1   X2 Y1  Y2
# 1       A1      300   100 160    0.3    0.5  Face   0 1022  0   0
# 2       A1      300   100 160    0.3    0.5  Eyes 300  600 30 300
# 3       A1      300   100 160    0.3    0.5 Mouth 301  600 31 301
# 4       A2       NA    NA  NA     NA     NA  Face   0    0  0   6
# 5       A2       NA    NA  NA     NA     NA  Eyes 305  604 30 305
# 6       A2       NA    NA  NA     NA     NA Mouth 306  604 38 306
# 7       A3      300     1 301    0.5    0.4  <NA>  NA   NA NA  NA
# 8       A4       60   100 160    0.4    0.5  <NA>  NA   NA NA  NA
# 9       A5       NA    NA  NA     NA     NA  <NA>  NA   NA NA  NA
# 10      H1       NA    NA  NA     NA     NA  <NA>  NA   NA NA  NA

Я использовал full_join, который сохранит все строки из обоих фреймов данных. Вместо этого вы можете использовать соединения inner, left или right, если хотите изменить поведение. (Внутренний сохранит только совпадающие строки, левый и правый сохранят все строки из 1-го или 2-го фрейма данных (соответственно) и любые совпадающие из другого.

person Gregor Thomas    schedule 04.11.2020