【发布时间】:2018-04-18 10:17:50
【问题描述】:
我想删除数据集的每个集群的异常值。该数据集包含 3 列具有不同变量的列,以及指示每个点分配到的集群的列。如果 3 个变量中只有一个是异常值,则将删除整行。识别出异常值以确定跨越平均值加/减三个标准差的区间,但我也可以使用outlierfunction。
我能够在不考虑集群的情况下删除异常值,使用:
#data: each row has 3 different variables and the allocating cluster (k)
dat <- cbind.data.frame(v1=c(sample(5:10, 100,replace=T),sample(1:5,5)),
v2=c(sample(20:25, 100,replace=T),sample(5:10,5)),
v3=c(sample(30:35, 100,replace=T),sample(10:20,5)),
k=c(rep(1:5,21)))
### find outliers without considering clusters
#(obviously only the last 5 samples in this example)
rmv<-c()
for(i in 1:3){
variable<-dat[,i]
rmv.tm<-which(variable >= (mean(variable)+sd(variable)*3)
| variable <= (mean(variable)-sd(variable)*3))
rmv<-c(rmv,rmv.tm)
}
rmv<-unique(rmv)
rmv
### remove outliers
dat_clean <- dat[-rmv,]
但是,考虑到集群,我无法检测异常值,因此无法确定每个集群内部的区间,而不是整个人口中的区间。我想嵌套另一个循环,但我发现很难编码。 任何帮助将不胜感激。
【问题讨论】:
-
我不明白你所说的在每个集群内而不是在整个人口内是什么意思,你想只删除每列的异常值吗?如果是这样,列的长度可能会变得不同,并且数据集将不再是
data.frame而是list。