将数据帧值与多个向量匹配

时间:2014-05-29 04:43:20

标签: r dataframe

我有一个数据框,其中每列包含不同的测量值,但第一列包含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,]

让我难倒的部分是将此方法应用于具有适当异常值向量的每列。我知道我可以手动完成每一个,然后使用数据框,但我真的希望有人可以帮我找到一种方法将匹配函数的多个调用组合成一个命令。提前谢谢。

2 个答案:

答案 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