Как да изчислим средна базова стойност за изпитване на участник в рамка с данни

Имам данни за пупилометрия за 24 участници, всеки от които има хиляди редове измервания на размера на зеницата (както съм нарекъл PupilAvg). Колоната за време се нарича TrialTimestamp и се измерва в ms. Имам също trial.number и trial.type като колони. Главата на моя кадър с данни (mydata1) може да се види по-долу.

RecordingName trial.number trial.type TrialTimestamp PupilAvg
1    Mix_20_S04            1       same              0    3.910
2    Mix_20_S04            1       same             17    3.815
3    Mix_20_S04            1       same            133    3.545
4    Mix_20_S04            1       same            150    3.460
5    Mix_20_S04            1       same            167    3.410
6    Mix_20_S04            1       same            183    3.345

Въпросът ми е: как мога да получа средна базова линия за изпитване на участник, където базовата линия е равна на средния размер на зеницата между времето 5400ms и 5500ms? Бих искал да мога да извадя тези базови измервания от измерванията на зеницата в моя прозорец за анализ (за да ги коригирам за индивидуалните различия).

Измислих код, за да направя това за едно изпитание (изпитание 3) за един участник (04).

S04data<-filter(mydata1, RecordingName == "Mix_20_S04")
S04data1<-filter(S04data, trial.number == "3")
baselineS04 <- with(S04data1, mean(PupilAvg[TrialTimestamp >= 5400 & TrialTimestamp <= 5500]))

Това връща стойност 3,1225. Така че базовата стойност за участник 4, опит 3 е 3,1225.

Ще съм много благодарен, ако някой може да ми помогне да напиша код, за да получа базови мерки за всеки участник при всяко изпитване (без да се налага да пиша своя индивидуален код за всеки участник за всяко изпитване!!).


person Nadia Laccitiello    schedule 22.10.2014    source източник


Отговори (2)


Мисля, че можете да използвате aggregate с подмножеството от данни, за да включите само наблюдения в рамките на вашия диапазон на TrialTimestamp. Тук използвам 130 и 150 (така че мога да използвам публикуваните данни), но можете да ги промените на 5400 и 5500ms.

# your data
mydata1 <- read.table(text="RecordingName trial.number trial.type TrialTimestamp PupilAvg
1    Mix_20_S04            1       same              0    3.910
2    Mix_20_S04            1       same             17    3.815
3    Mix_20_S04            1       same            133    3.545
4    Mix_20_S04            1       same            150    3.460
5    Mix_20_S04            1       same            167    3.410
6    Mix_20_S04            1       same            183    3.345", header=TRUE)


# Find mean: subset the data so that only values within 
# required TrialTimestamp range
aggregate(PupilAvg ~ RecordingName + trial.number ,
     data=mydata1[(mydata1$TrialTimestamp > 130 & mydata1$TrialTimestamp < 155),], 
                                                               mean)

РЕДАКТИРАНЕ

Както Майкъл спомена в коментарите, aggregate има аргумент subset, така че може да го намерите по-лесно за окото

aggregate(PupilAvg ~ RecordingName + trial.number, data=mydata1, mean, 
                         subset = TrialTimestamp > 130 & TrialTimestamp < 155)
person user20650    schedule 22.10.2014
comment
Може да се възползва от subset аргумент на aggregate: aggregate(PupilAvg ~ RecordingName + trial.number, data=mydata1, mean, subset = TrialTimestamp > 130 & TrialTimestamp < 155) - person Michael Lawrence; 23.10.2014
comment
@MichaelLawrence; благодаря Майкъл - знаеш, че никога преди не съм забелязвал аргумента за подмножество - person user20650; 23.10.2014

Вижте дали ви харесва, опитайте опцията data.table:

library(data.table)
setDT(mydata1) # set data frame to data table
mydata1[TrialTimestamp > 130 & TrialTimestamp < 155,  ## i arg  - subset
             list(PupilAvg = mean(PupilAvg)),         ## j arg  - aggregate
       by = c("RecordingName", "trial.number")]       ## by arg - group by
#    RecordingName trial.number      PupilAvg
# 1:    Mix_20_S04            1        3.5025

Също така проверка на ?between в пакета data.table.

person KFB    schedule 22.10.2014