R 从数据帧(+;-3 SDs)中删除单变量异常值
我对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
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,] ))