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

У меня есть данные пупиллометрии для 24 участников, у каждого из которых есть тысячи строк измерений размера зрачка (как я назвал PupilAvg). Столбец времени называется TrialTimestamp и измеряется в мс. У меня также есть столбцы 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

Мой вопрос: как я могу получить средний базовый уровень для каждого испытания на участника, где базовый уровень равен среднему размеру зрачка между 5400 мс и 5500 мс? Я хотел бы иметь возможность вычесть эти базовые измерения из измерений зрачка в моем окне анализа (чтобы скорректировать их с учетом индивидуальных различий).

Я придумал код, чтобы сделать это для одного испытания (испытание 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 и 5500 мс.

# 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