R 计算科目水平平均值和标准差,并将+/-3SD的值标记为新变量中缺失的值

R 计算科目水平平均值和标准差,并将+/-3SD的值标记为新变量中缺失的值,r,R,我有一个由数百名受试者组成的数据框架,其中每名受试者在测量反应时间rt的行为任务上有x个试验次数。我需要将rt标记为缺失,即,当rt高于和低于受试者平均值+/-3标准偏差SD时,NA。以下是一个示例数据框: rt <- runif(60, 300, 900) id <- rep(1:3,each=20) df <- as.data.frame(cbind(rt,id)) 我可以计算每个受试者的平均值和sd,但我不知道如何将每个受试者的+/-3SD值与原始rt变量进行比较,并创

我有一个由数百名受试者组成的数据框架,其中每名受试者在测量反应时间rt的行为任务上有x个试验次数。我需要将rt标记为缺失,即,当rt高于和低于受试者平均值+/-3标准偏差SD时,NA。以下是一个示例数据框:

rt <- runif(60, 300, 900)
id <- rep(1:3,each=20)
df <- as.data.frame(cbind(rt,id))
我可以计算每个受试者的平均值和sd,但我不知道如何将每个受试者的+/-3SD值与原始rt变量进行比较,并创建一个新的rt变量,其中+/-3SD值缺失。我不确定是否应该尝试编写for循环或使用apply函数。任何帮助或建议都将不胜感激。多谢各位

means<-tapply(df$rt,df$id,FUN=mean)
sds<-tapply(df$rt,df$id,FUN=sd)
newrt<-ifelse(abs(df$rt-means[df$id])/sds[df$id]>=3,NA,df$rt)
结果在一个包含每个受试者与其平均值不同的标准偏差数的向量中,与3相比,我们得到一个判断受试者是否至少不同于3个标准偏差的真向量或假向量。最后,ifelse函数将为每个差值至少相差3 sd的值选择NA,否则选择测量的实际值

结果在一个包含每个受试者与其平均值不同的标准偏差数的向量中,与3相比,我们得到一个判断受试者是否至少不同于3个标准偏差的真向量或假向量。最后,ifelse函数将为每个差值至少3 sd的测量值选择NA值,否则选择测量值的实际值。

您可以使用:

library(dplyr)
df <- df %>% group_by(id) %>% mutate(newrt = ifelse(abs(rt - mean(rt)) >= 3 * sd(rt), NA, rt))
在您提供的数据中,没有符合此描述的值,但代码应该可以工作。

您可以使用:

library(dplyr)
df <- df %>% group_by(id) %>% mutate(newrt = ifelse(abs(rt - mean(rt)) >= 3 * sd(rt), NA, rt))
在您提供的数据中,没有符合此描述的值,但代码应该可以工作。

我们可以使用data.table和assign:=In place,这将更有效。我们将“data.frame”转换为“data.table”setDTdf,将newrt创建为rt的副本,基于从i中的逻辑条件获得的真值,按id分组,我们将新的值分配给NA

我们可以使用data.table和assign:=就地分配,这样效率更高。我们将“data.frame”转换为“data.table”setDTdf,将newrt创建为rt的副本,基于从i中的逻辑条件获得的真值,按id分组,我们将新的值分配给NA


下面的不也是这样吗?setDTdf[absrt meanrt>=sdrt*1.5,rt:=NA,by=id]@mtoto是的,它也这样做。但是,OP似乎希望结果出现在一个新列中,所以我初始化了NewRTX,下面的操作不也是这样吗?setDTdf[absrt meanrt>=sdrt*1.5,rt:=NA,by=id]@mtoto是的,它也这样做。但是,OP似乎希望结果出现在一个新列中,所以我初始化了newrt
library(data.table)
setDT(df)[, newrt := rt][abs(rt-mean(rt)) >= 3*sd(rt),
                                    newrt := NA_real_ ,id]