1

我有 24 名参与者的瞳孔测量数据,每个参与者都有数千行瞳孔大小测量值(正如我所命名的PupilAvg)。时间列被调用TrialTimestamp并以毫秒为单位。我也有trial.numbertrial.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 毫秒之间的平均瞳孔大小?我希望能够从我的分析窗口内的瞳孔测量值中减去这些基线测量值(以针对个体差异进行校正)。

我已经为一名参与者(04)的一次试验(试验 3)提出了一个代码。

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。

如果有人可以帮助我编写代码以在每次试验中为每个参与者获取基线测量值,我将非常感激(而我不必为每次试验的每个参与者写出我的个人代码!!)。

4

2 回答 2

1

看看你是否喜欢尝试 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 包中结帐。

于 2014-10-22T22:03:49.660 回答
1

我认为您可以使用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)
于 2014-10-22T19:59:04.067 回答