我有一个数据框,其中每列包含不同的测量值,但第一列包含ID。我想创建一个较小的数据框,其中只包含那些至少在一列中为异常值的ID的所有列。这是数据框现在的样子:
BRICK MARBLE MASONITE STEEL
ff5 1.9870268 0.3344881 0.09917627 3.205099
fdd 1.8088945 0.5292931 0.10868434 1.835525
fd9 1.2062831 0.2696240 0.12047189 3.279331
我使用以下方法创建了包含每列中异常值的向量:
outliers_Marble = boxplot(Material$MARBLE, plot=FALSE)$out
我想出了如何使用
制作与单个异常值矢量匹配的迷你数据帧newframe = Material[match(outliers_Marble, Material$MARBLE,]
让我难倒的部分是将此方法应用于具有适当异常值向量的每列。我知道我可以手动完成每一个,然后使用数据框,但我真的希望有人可以帮我找到一种方法将匹配函数的多个调用组合成一个命令。提前谢谢。
答案 0 :(得分:1)
这里有一些添加了异常值的测试数据
set.seed(14)
dd<-data.frame(
ID=paste0("ff",1:50),
BRICK=rnorm(50,2),
MARBLE=runif(50),
MASONITE=runif(50, 0, .4),
STEEL=rnorm(50,5)
)
dd$BRICK[5]<-6
dd$MARBLE[13]<-1.7
dd$MASONITE[26]<- -2
dd$STEEL[30]<- 20
我没有使用boxplot
,而是前往boxplot.stats
获取智者的边缘,以便更容易找到异常值的索引。以下是如何做到的
outliers<-unique(unlist(lapply(dd[-1], function(x) {
ex <- boxplot.stats(x)$stats; which(x<ex[1] | x>ex[5])
})))
我们可以看到我们找到了它们
> outliers
[1] 5 13 26 30
现在我已经合并并从异常值中移除了重复项,现在我可以将它们从表中删除
newframe <- if(length(outliers)>0)
dd[-outliers, ]
else
dd
答案 1 :(得分:0)
试试以下......
#Defining function for outlier
outLierFun = function(x){boxplot(x, plot=FALSE)$out}
#Removing column for which outlier test not needed
colNames = setdiff(colnames(Material),'BRICK')
#Finding out outlier
outliers = lapply(Material[colNames ], FUN = outLierFun)
#Empty Dataframe
newFrame = Material[0,]
for(i in colNames){
temp = subset(Material, get(i) %in% outliers[[i]])
newFrame = unique(rbind(newFrame, temp))
}
#Final results
newFrame