Чтобы получить хорошую сводную статистику, вы можете использовать aggregate()
.
aggregate(rt ~ target + ptp, dat, function(x) c(mean=mean(x), sd=sd(x), sd196=sd(x)*1.96))
# target ptp rt.mean rt.sd rt.sd196
# 1 dog 1 552.00000 766.50375 1502.34735
# 2 hat 1 1546.50000 782.76721 1534.22373
# 3 dog 2 907.50000 14.84924 29.10452
# 4 hat 2 1144.50000 94.04520 184.32860
# 5 dog 3 2572.00000 2022.32539 3963.75777
# 6 hat 3 1060.50000 228.39549 447.65516
Для исключения (при условии, что вы хотите исключить целые наблюдения для каждого "target"
), вы можете установить подмножество данных равным NA
с использованием ave()
.
dat$rt[with(dat, ave(rt, target, ptp, FUN=function(x) mean(x)/sd(x))) > 1.96] <- NA
# ptp rt group target
# 1 1 1094 E dog
# 2 1 NA E hat
# 3 2 NA E dog
# 4 2 NA E hat
# 5 3 1142 E dog
# 6 3 NA E hat
# 7 1 10 W dog
# 8 1 NA W hat
# 9 2 NA W dog
# 10 2 NA W hat
# 11 3 4002 W dog
# 12 3 NA W hat
Чтобы не исключать участника целиком, не включайте ptp
в ave()
и выполните:
dat$rt[with(dat, ave(rt, target, FUN=function(x) mean(x)/sd(x))) > 1.96] <- NA
NB: Заранее проверьте, не присвоены ли имена функциям. В вашем примере вы создаете конфликт с функциями mean()
и sd()
.
Данные
dat <- structure(list(ptp = c(1L, 1L, 2L, 2L, 3L, 3L, 1L, 1L, 2L, 2L,
3L, 3L), rt = c(1094L, 2100L, 918L, 1211L, 1142L, 1222L, 10L,
993L, 897L, 1078L, 4002L, 899L), group = c("E", "E", "E", "E",
"E", "E", "W", "W", "W", "W", "W", "W"), target = c("dog", "hat",
"dog", "hat", "dog", "hat", "dog", "hat", "dog", "hat", "dog",
"hat")), row.names = c(NA, -12L), class = "data.frame")