我有反应时间数据,我试图摆脱异常值。我的目标是计算每个条件下每个参与者的标准偏差,并删除超过平均值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。
答案 0 :(得分:0)
使用dplyr
和magrittr
软件包:
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
)。使用这些均值和标准差值,您可以过滤(即保留)rt
列rt <= 2*stdev + avg
的任何值。最后,选择原始列。完成后,您可以将输出转换为本机R data.frame。