R 从数据帧(+;-3 SDs)中删除单变量异常值

R 从数据帧(+;-3 SDs)中删除单变量异常值,r,outliers,R,Outliers,我对R如此陌生,以至于我很难从别人的问题中找到我需要的东西。我想我的问题很简单,没有人愿意问 创建一个新的数据框架的最简单的代码是什么?该数据框架排除了条件内某个变量的单变量异常值(我将其定义为与条件平均值相差3个SDs的点) 我很难为情地展示我的尝试,但它就在这里 greaterthan <- mean(dat$var2[dat$condition=="one"]) + 2.5*(sd(dat$var2[dat$condition=="one"])) le

我对R如此陌生,以至于我很难从别人的问题中找到我需要的东西。我想我的问题很简单,没有人愿意问

创建一个新的数据框架的最简单的代码是什么?该数据框架排除了条件内某个变量的单变量异常值(我将其定义为与条件平均值相差3个SDs的点)

我很难为情地展示我的尝试,但它就在这里

greaterthan <- mean(dat$var2[dat$condition=="one"]) + 
               2.5*(sd(dat$var2[dat$condition=="one"]))
lessthan    <- mean(dat$var2[dat$condition=="one"]) -
               2.5*(sd(dat$var2[dat$condition=="one"]))   

withoutliersremovedone1 <-dat$var2[dat$condition=="one"] < greaterthan
greaterthan我使用包中的
winsorize()
函数来执行此任务。以下是它的例子:

R> example(winsorize)

winsrzR> ## generate data
winsrzR> set.seed(1234)     # for reproducibility

winsrzR> x <- rnorm(10)     # standard normal

winsrzR> x[1] <- x[1] * 10  # introduce outlier

winsrzR> ## winsorize data
winsrzR> x
 [1] -12.070657   0.277429   1.084441  -2.345698   0.429125   0.506056  
 [7]  -0.574740  -0.546632  -0.564452  -0.890038

winsrzR> winsorize(x)
 [1] -3.250372  0.277429  1.084441 -2.345698  0.429125  0.506056 
 [7] -0.574740 -0.546632 -0.564452 -0.890038

winsrzR>
R>示例(winsorize)
winsrzR>生成数据
winsrzR>设定种子(1234)#用于再现性
winsrzR>x x[1]##winsorize数据
winsrzR>x
[1] -12.070657   0.277429   1.084441  -2.345698   0.429125   0.506056  
[7]  -0.574740  -0.546632  -0.564452  -0.890038
winsrzR>winsorize(x)
[1] -3.250372  0.277429  1.084441 -2.345698  0.429125  0.506056 
[7] -0.574740 -0.546632 -0.564452 -0.890038
winsrzR>
这默认为中值+/-2 mad,但您可以设置平均+/-3 sd的参数

> dat <- data.frame(
                    var1=sample(letters[1:2],10,replace=TRUE),
                    var2=c(1,2,3,1,2,3,102,3,1,2)
                   )
> dat
   var1 var2
1     b    1
2     a    2
3     a    3
4     a    1
5     b    2
6     b    3
7     a  102 #outlier
8     b    3
9     b    1
10    a    2
使用
比例
功能进行一次或多次速记:

dat[!abs(scale(dat$var2)) > 2,]

   var1 var2
1     b    1
2     a    2
3     a    3
4     a    1
5     b    2
6     b    3
8     b    3
9     b    1
10    a    2
编辑

这可以扩展到使用
by

do.call(rbind,by(dat,dat$var1,function(x) x[!abs(scale(x$var2)) > 2,] ))

这假设
dat$var1
是定义每行所属组的变量。

Cheers-1与此相关。我想根据各组的平均值排除,例如,我想排除b的病例,这些病例仅高于b的平均值+-3 sds,而不是整个var 2平均值。我该怎么做呢?为了解释最后一行是如何工作的:“by”根据
dat$var1
中的值分割数据帧
dat
,每个数据块都被送入此处定义的
函数(x)
,该函数返回一个没有异常值的数据帧,然后调用
rbind
函数,将来自每个
data$var1
类的所有数据帧作为参数合并回来-这就是
do.call的神奇之处。
do.call(rbind,by(dat,dat$var1,function(x) x[!abs(scale(x$var2)) > 2,] ))