根据另外两列确定异常值

时间:2016-06-16 20:22:25

标签: r

我的表格中有数据:

Length      Width     Weight    
1           2         4.5
1           2         4.5
1           2         6.1
1           2         4.5
1           3         9.1
1           3         9.05
1           3         9.2
1           3         9.07
1           3         10.2

对于许多长度,每个宽度都很多。然而,如上所述有许多重量误差。什么是识别这些错误的最佳方法。

最终我想要像

这样的东西
Length      Width     Weight     Quality   
1           2         4.5        good
1           2         4.5        good
1           2         6.1        bad
1           2         4.5        good
1           3         9.1        good
1           3         9.05       good
1           3         9.2        good
1           3         9.07       good
1           3         10.2       bad

到目前为止,我的想法(不知道R中的确切编码)会做类似的事情。

for lengths in data$length
    for width in data$width
         avg=mean(data$weight[data$length == length & data$width == width]
         if (data$weight-avg)/avg  >0.1
              data$quality = "bad"
         else data$quality = "good"

我不确定在R中编程是多么可行/实用,只是想解释一下我的想法和目标。

然而,有些问题是值得用作"正确"值。我使用的是平均值,但一般来说模式可能会运行良好。大多数"组"就像宽度2一样,所有都与异常值相同(如果有的话)。然而,有一些像宽度3这样的群体的情况,即使没有出现过多次,也很清楚异常值是什么。

2 个答案:

答案 0 :(得分:1)

  我不确定我理解你的问题,但我想你想按组计算平均体重,并按一定条件设定质量。

   1.获取数据。    

data = data.frame(Length=c(rep(1,9)),Width=c(rep(2,4),rep(3,5)),Weight=c(4.5,4.5,6.1,4.5,9.1,9.05,9.2,9.07,10.2))

> data

Length Width Weight 1 1 2 4.50 2 1 2 4.50 3 1 2 6.10 4 1 2 4.50 5 1 3 9.10 6 1 3 9.05 7 1 3 9.20 8 1 3 9.07 9 1 3 10.20

  2.长度和宽度的团体     

library(dplyr)
by_Length_Width = group_by(data,Width,Length)
group = summarise(by_Length_Width,avg = mean(Weight))
data1 = left_join(data,group)

  3.设置质量列     

data1$quality = ifelse((data1$Weight-data1$avg)/data1$avg>0.1,"bad","good")

data1 Length Width Weight avg quality 1 1 2 4.50 4.900 good 2 1 2 4.50 4.900 good 3 1 2 6.10 4.900 bad 4 1 2 4.50 4.900 good 5 1 3 9.10 9.324 good 6 1 3 9.05 9.324 good 7 1 3 9.20 9.324 good 8 1 3 9.07 9.324 good 9 1 3 10.20 9.324 good

   顺便说一句,for循环for循环在R:)中不是一种有效的方式。

答案 1 :(得分:0)

我认为实现目标的一种方法如下:

计算每个长度和宽度的平均重量。然后定义合理的阈值,帮助您识别错误。然后只需将所有值与这些阈值进行比较。使用dplyr函数可以相对简单地完成。

另一种方法是使用长度和权重作为回归量和权重作为因变量生成多元回归模型。然后,您可以为预测定义置信区间,并标记为" bad"所有那些摆脱这个置信区间的家伙。为此你可以使用" lm"和"预测"功能