根据之前的连续试验计算平均值

时间:2017-03-31 11:09:44

标签: r

我想计算SACCADIC_RT的每个COMMISSION_ERROR =1的平均值,每{5}连续HITS=1,每个ID每个条件。

ID  | TRIAL | TRIAL_TYPE| CONDITION | COMMISSION_ERROR  | HITS| SACCADIC_RT
1     183     nogo        square_1     1                  -1    175
1     54      go          square_1    -1                   1    259
1     26      nogo        square_1     1                  -1    365
1     3       nogo        square_1     1                  -1    346
1     100     nogo        square_1     1                  -1    287
1     11      go          square_1    -1                   1    164
1     52      go          square_1    -1                   1    244
1     8       go          square_1    -1                   1    223 
1     10      go          square_1    -1                   1    183
1     21      go          square_1    -1                   1    234
1     32      go          square_1     1                  -1    221
1     2       go          square_1    -1                   1    183
1    13       nogo        square_1     0                  -1    -1
1    87       nogo        square_2     1                  -1    228
1    95       nogo        square_2     1                  -1    274
1    111      go          square_2    -1                   1    305
1    28       nogo        square_2     0                  -1    309
1    65       go          square_2    -1                   0    -1
1    40       nogo        square_1     0                  -1    199
1    19       nogo        square_1     0                  -1    207
1    28       go          square_1    -1                   1    257
2    45       nogo        square_1     1                  -1    169
2    197      nogo        square_1     1                  -1    350
2    115      nogo        square_1     1                  -1    321
2    65       go          square_2    -1                   1    298
2    24       go          square_2    -1                   0    -1
2    1        nogo        square_2     1                  -1    183
2    77       go          square_2    -1                   1    225
2    90       go          square_2    -1                   1    305
2    89       go          square_2    -1                   1    210
2    104      go          square_2    -1                   1    199
2    116      go          square_2    -1                   1    175
2    29       nogo        square_2     1                  -1    99
2    41       go          square_2    -1                   1    104

可以在r中重新创建样本表:

structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
                              1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
                              2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), X..TRIAL.. = c(183L, 54L, 26L, 
                                                                              3L, 100L, 11L, 52L, 8L, 10L, 21L, 32L, 2L, 13L, 87L, 95L, 111L, 
                                                                              28L, 65L, 40L, 19L, 28L, 45L, 197L, 115L, 65L, 24L, 1L, 77L, 
                                                                              90L, 89L, 104L, 116L, 29L, 41L), TRIAL_TYPE. = structure(c(2L, 
                                                                                                                                         1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 
                                                                                                                                         1L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 
                                                                                                                                         1L), .Label = c("go", "nogo"), class = "factor"), CONDITION = structure(c(1L, 
                                                                                                                                                                                                                   1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
                                                                                                                                                                                                                   2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
                                                                                                                                                                                                                   2L), .Label = c("square_1", "square_2"), class = "factor"), X..COMMISSION_ERROR = c(1L, 
                                                                                                                                                                                                                                                                                                       -1L, 1L, 1L, 1L, -1L, -1L, -1L, -1L, -1L, 1L, -1L, 0L, 1L, 1L, 
                                                                                                                                                                                                                                                                                                       -1L, 0L, -1L, 0L, 0L, -1L, 1L, 1L, 1L, -1L, -1L, 1L, -1L, -1L, 
                                                                                                                                                                                                                                                                                                       -1L, -1L, -1L, 1L, -1L), X..HITS. = c(-1L, 1L, -1L, -1L, -1L, 
                                                                                                                                                                                                                                                                                                                                             1L, 1L, 1L, 1L, 1L, -1L, 1L, -1L, -1L, -1L, 1L, -1L, 0L, -1L, 
                                                                                                                                                                                                                                                                                                                                             -1L, 1L, -1L, -1L, -1L, 1L, 0L, -1L, 1L, 1L, 1L, 1L, 1L, -1L, 
                                                                                                                                                                                                                                                                                                                                             1L), SACCADIC_RT = c(175L, 259L, 365L, 346L, 287L, 164L, 244L, 
                                                                                                                                                                                                                                                                                                                                                                  223L, 183L, 234L, 221L, 183L, -1L, 228L, 274L, 305L, 309L, -1L, 
                                                                                                                                                                                                                                                                                                                                                                  199L, 207L, 257L, 169L, 350L, 321L, 298L, -1L, 183L, 225L, 305L, 
                                                                                                                                                                                                                                                                                                                                                                  210L, 199L, 175L, 99L, 104L)), .Names = c("ID", "X..TRIAL..", 
                                                                                                                                                                                                                                                                                                                                                                                                            "TRIAL_TYPE.", "CONDITION", "X..COMMISSION_ERROR", "X..HITS.", 
                                                                                                                                                                                                                                                                                                                                                                                                            "SACCADIC_RT"), class = "data.frame", row.names = c(NA, -34L))

因此,此示例的结果将如下:

ID | CONDITION |  x
1    square_1    221
2    square_2    99

1 个答案:

答案 0 :(得分:0)

您可以使用数据包data.table来执行此任务。

步骤如下:

1)对于每个ID和条件计算命中的滚动总和

2)只占用满足2个条件的行:前一行的commision_error = 1,滚动总和列中的数字为5

3)计算在步骤2中创建的表中每个ID和条件的平均值

.emacs

代码说明:

# load your data data <- read.csv("./yourData.csv") # load data table library library(data.table) # convert your data to data.table object data <- data.table(data) # group data by ID and Condition, calculate rolling sum over 5 rows data[, roll := Reduce('+', shift(HITS, 0:4)), by = list(ID, CONDITION)] # take only rows where there were 5 hits in a row and commission error is 1 newData <- data[shift(roll, 1) == 5 & COMMISSION_ERROR == 1] # calculate mean of SACCADIC_RT for each ID and Condition in the new dataset newData[, meanSacc := mean(SACCADIC_RT), by = list(ID, CONDITION)]

shift函数允许您根据前一行中的值计算当前行中的值。这里&#39; Reduce(&#39; +&#39;,shift(HITS,0:4))&#39;获取给定行上的点击值,并将其添加到3之前的点击值行。然后将该值写入名为roll的新列。

roll := Reduce('+', shift(HITS, 0:4))

上述代码仅保留原始数据集中的行,其中列newData <- data[shift(roll, 1) == 5 & COMMISSION_ERROR == 1]的上一行中的值为5,当前行的roll值等于1。 / p>

COMISSION_ERROR

以上片段为每个newData[, meanSacc := mean(SACCADIC_RT), by = list(ID, CONDITION)]SACCADIC计算ID _ RT的平均值,并且仅根据上面创建的新数据集中的行计算均值。然后将均值写入名为CONDITION

的新值