根据每个条件修剪每个参与者的反应时间数据

时间:2016-04-07 14:03:56

标签: r

我有反应时间数据,我试图摆脱异常值。我的目标是计算每个条件下每个参与者的标准偏差,并删除超过平均值2个标准差的值。 我的data.frame data_vfin看起来像这样。每个参与者每个条件有四个条件和六个观察值。

participant condition   rt
1435157254  I_A        728
1435157254  A_A        752
1435157254  A_S        2771
1435157254  I_S        673
1435157254  I_A        1749
1435157254  A_A        1215
1435157254  A_S        681
1435157254  I_S        488
1435157254  I_A        464
1435157254  A_A        525
1435157254  A_S        517
1435157254  I_S        426
1435157254  I_A        431
1435157254  A_A        453
1435157254  A_S        522
1435157254  I_S        421
1435157254  I_A        432
1435157254  A_A        493
1435157254  A_S        377
1435157254  I_S        425
1435157254  I_A        356
1435157254  A_A        486
1435157254  A_S        369
1435157254  I_S        381
1435157283  A_A        3088
1435157283  I_S        568
1435157283  A_S        488
1435157283  I_A        432
1435157283  A_A        536
1435157283  I_S        456
1435157283  A_S        440
1435157283  I_A        456
1435157283  A_A        1192
1435157283  I_S        344
1435157283  A_S        432
1435157283  I_A        456
1435157283  A_A        449
1435157283  I_S        440
1435157283  A_S        592
1435157283  I_A        448
1435157283  A_A        1136
1435157283  I_S        448
1435157283  A_S        384
1435157283  I_A        472
1435157283  A_A        432
1435157283  I_S        624
1435157283  A_S        464

我可以使用以下代码修剪参与者或条件:

data_trimmed <- do.call(rbind,by(data_vfin,data_vfin$participant, function(x) x[!abs(scale(x$rt)) > 2,] ))

然而,我无法同时根据每个参与者的具体情况这样做。我很擅长与R合作,所以任何帮助都会受到欢迎。

P.S。:我尝试使用trimr包,这是为了这个确切的操作,但当我尝试修剪每个参与者的每个条件并选择&#34; raw&#34;作为返回类型,它返回一个空的data.frame。

1 个答案:

答案 0 :(得分:0)

使用dplyrmagrittr软件包:

install.packages(pkgs=c('dplyr','magrittr'))
library(dplyr)
library(magrittr)

rt <- structure(list(participant = c(1435157254L, 1435157254L, 1435157254L, 
1435157254L, 1435157254L, 1435157254L, 1435157254L, 1435157254L, 
1435157254L, 1435157254L, 1435157254L, 1435157254L, 1435157254L, 
1435157254L, 1435157254L, 1435157254L, 1435157254L, 1435157254L, 
1435157254L, 1435157254L, 1435157254L, 1435157254L, 1435157254L, 
1435157254L, 1435157283L, 1435157283L, 1435157283L, 1435157283L, 
1435157283L, 1435157283L, 1435157283L, 1435157283L, 1435157283L, 
1435157283L, 1435157283L, 1435157283L, 1435157283L, 1435157283L, 
1435157283L, 1435157283L, 1435157283L, 1435157283L, 1435157283L, 
1435157283L, 1435157283L, 1435157283L, 1435157283L), condition = structure(c(3L, 
1L, 2L, 4L, 3L, 1L, 2L, 4L, 3L, 1L, 2L, 4L, 3L, 1L, 2L, 4L, 3L, 
1L, 2L, 4L, 3L, 1L, 2L, 4L, 1L, 4L, 2L, 3L, 1L, 4L, 2L, 3L, 1L, 
4L, 2L, 3L, 1L, 4L, 2L, 3L, 1L, 4L, 2L, 3L, 1L, 4L, 2L), .Label = c("A_A", 
"A_S", "I_A", "I_S"), class = "factor"), rt = c(728L, 752L, 2771L, 
673L, 1749L, 1215L, 681L, 488L, 464L, 525L, 517L, 426L, 431L, 
453L, 522L, 421L, 432L, 493L, 377L, 425L, 356L, 486L, 369L, 381L, 
3088L, 568L, 488L, 432L, 536L, 456L, 440L, 456L, 1192L, 344L, 
432L, 456L, 449L, 440L, 592L, 448L, 1136L, 448L, 384L, 472L, 
432L, 624L, 464L)), .Names = c("participant", "condition", "rt"
), class = "data.frame", row.names = c(NA, -47L))

trimmed <- rt %>% group_by(participant, condition) %>% 
           mutate(avg = mean(rt), stdev = sd(rt)) %>% 
           filter(rt <= 2*stdev+avg) %>% 
           select(participant, condition, rt) %>% 
           as.data.frame()

只删除了一行。 rt有47行,trimmed有46行

这里发生了什么?

您首先按参与者和条件进行分组,并且对于每个组,您将获得stdev data.frame的标准偏差(avg)和平均值(mutating)。使用这些均值和标准差值,您可以过滤(即保留)rtrt <= 2*stdev + avg的任何值。最后,选择原始列。完成后,您可以将输出转换为本机R data.frame。