如何基于R中的分类变量删除数据框中的离群值

ll

我有一个交易数据的数据集,如下所示:

 prodid  priceperitem       date
   62420         18.9  2014-10-09
   62420         29.9  2014-09-20
   62420         18.9  2014-10-11
   62420         27.9  2014-07-04
   62420         18.9  2014-08-25
   62420         18.9  2014-11-01

我想删除每种产品的价格异常值。

我尝试了以下代码,并且将每个产品的价格都用NA代替了离群值。但这是一个单独的列表,并按prodid分组,我希望data变量保留在数据框中,而不要有一个新列表。

remove.outliers <- tapply(priceperitem, prodid, function(x) {
     qnt <- quantile(x, probs=c(.25, .75))
      H <- 1.5 * IQR(x)
      y <- x
      y[x < (qnt[1] - H)] <- NA
      y[x > (qnt[2] + H)] <- NA
      y
})

这段代码将为我提供如下输出:

$205780229

 [1]   NA 10.9 10.5 10.9 10.9   NA ....

这是一个新数组,但我想要的是以下内容:

     prodid       priceperitem    date
    205780229    NA              2014-10-03
    205780229    10.9            2014-10-20
    205780229    10.5            2014-10-30
    205780229    10.9            2014-5-23
    205780229    10.9            2014-11-20
....
杰伦·维米尔

您可以使用该by函数以便将数据帧分为较小的子集,然后在各个子组上执行函数调用。在这些函数调用期间,您可以轻松地从每个子集中删除异常值并返回结果。接下来,您可以通过将子结果合并在一起来获得结果数据框。

我将使用以下数据框来举例说明:

prodid <- c(rep(62420,5),rep(62421,5))
pricePerItem <- c(18,18.1,23,17.9,18.0,51.7,22,51,52,52.2)
dates <- rep(Sys.time(),10)
products <- data.frame(prodid,pricePerItem,dates)
products
   prodid pricePerItem               dates
1   62420         18.0 2015-07-06 01:51:31
2   62420         18.1 2015-07-06 01:51:31
3   62420         23.0 2015-07-06 01:51:31
4   62420         17.9 2015-07-06 01:51:31
5   62420         18.0 2015-07-06 01:51:31
6   62421         51.7 2015-07-06 01:51:31
7   62421         22.0 2015-07-06 01:51:31
8   62421         51.0 2015-07-06 01:51:31
9   62421         52.0 2015-07-06 01:51:31
10  62421         52.2 2015-07-06 01:51:31

我们将数据帧分组,prodid并过滤掉相关的异常值。我们通过合并结果来完成:

   result <- by(products,products$prodid,function(product) {
      qnt <- quantile(product$pricePerItem, probs=c(.25, .75))
      H <- 1.5 * IQR(product$pricePerItem)
      outlierCheck <- (product$pricePerItem) > qnt[1]-H & (product$pricePerItem<qnt[2]+H)
      noOutliers <- product[outlierCheck,]
    })

    filteredFrame <- do.call("rbind",result)
    filteredFrame
             prodid pricePerItem               dates
    62420.1   62420         18.0 2015-07-06 01:51:31
    62420.2   62420         18.1 2015-07-06 01:51:31
    62420.4   62420         17.9 2015-07-06 01:51:31
    62420.5   62420         18.0 2015-07-06 01:51:31
    62421.6   62421         51.7 2015-07-06 01:51:31
    62421.8   62421         51.0 2015-07-06 01:51:31
    62421.9   62421         52.0 2015-07-06 01:51:31
    62421.10  62421         52.2 2015-07-06 01:51:31

小编辑我注意到您想用一个NA替换离群值,而不是完全删除它们。您显然可以通过类似的方式来完成此行为。例如:

result <- by(products,products$prodid,function(product) {
  qnt <- quantile(product$pricePerItem, probs=c(.25, .75))
  H <- 1.5 * IQR(product$pricePerItem)

  outliers <- (product$pricePerItem) < qnt[1]-H | (product$pricePerItem > qnt[2]+H)
  product[outliers,2] <- NA
  product
})

filteredFrame <- do.call("rbind",result)
filteredFrame
         prodid pricePerItem               dates
62420.1   62420         18.0 2015-07-06 02:14:06
62420.2   62420         18.1 2015-07-06 02:14:06
62420.3   62420           NA 2015-07-06 02:14:06
62420.4   62420         17.9 2015-07-06 02:14:06
62420.5   62420         18.0 2015-07-06 02:14:06
62421.6   62421         51.7 2015-07-06 02:14:06
62421.7   62421           NA 2015-07-06 02:14:06
62421.8   62421         51.0 2015-07-06 02:14:06
62421.9   62421         52.0 2015-07-06 02:14:06
62421.10  62421         52.2 2015-07-06 02:14:06

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何基于任一列中的2个变量删除数据框中的行

来自分类常见问题

如何基于具有连续相同值的列事件删除数据框中的行

来自分类Dev

如何基于具有连续相同值的列事件删除数据框中的行

来自分类Dev

如何删除数据框中的相似对值?

来自分类Dev

如何根据会话变量中的值删除数据

来自分类Dev

如何删除数据框R中的某些日期

来自分类Dev

如何删除数据框R中的行

来自分类Dev

如何删除数据框中的回车

来自分类Dev

如何正确删除r中特定列表元素的离群值?

来自分类Dev

删除数据框中缺少值的重复值

来自分类Dev

如何删除数据框中的行并根据匹配的字符值对数字值求和

来自分类Dev

R 中的子集不删除数据框中的行

来自分类Dev

根据列值在列表中删除数据框

来自分类Dev

R:删除数据框中重复的行,该数据框中的第二列包含一个值

来自分类Dev

如何在R中按名称删除数据框中的行

来自分类Dev

如何在R中按名称删除数据框中的行

来自分类Dev

删除数据框(R)所有列中具有重复值的行

来自分类Dev

根据上一行(R)的值删除数据框中的一行

来自分类Dev

如何删除数据框中具有重复值的列?

来自分类Dev

根据R中的条件删除数据框的列

来自分类Dev

根据R中的日期删除数据框的行

来自分类Dev

如何删除数据框中的所有行?

来自分类Dev

如何查找和删除数据框中的重复项?

来自分类Dev

如何删除数据框中的“不可用”

来自分类Dev

如何删除数据框中的冗余行

来自分类Dev

如何删除数据框中的停用词(Python)

来自分类Dev

如何删除数据框中的换行符?

来自分类Dev

如何删除数据框中的Hetrogenius元素?

来自分类Dev

如何查找和删除数据框中的重复项?

Related 相关文章

  1. 1

    如何基于任一列中的2个变量删除数据框中的行

  2. 2

    如何基于具有连续相同值的列事件删除数据框中的行

  3. 3

    如何基于具有连续相同值的列事件删除数据框中的行

  4. 4

    如何删除数据框中的相似对值?

  5. 5

    如何根据会话变量中的值删除数据

  6. 6

    如何删除数据框R中的某些日期

  7. 7

    如何删除数据框R中的行

  8. 8

    如何删除数据框中的回车

  9. 9

    如何正确删除r中特定列表元素的离群值?

  10. 10

    删除数据框中缺少值的重复值

  11. 11

    如何删除数据框中的行并根据匹配的字符值对数字值求和

  12. 12

    R 中的子集不删除数据框中的行

  13. 13

    根据列值在列表中删除数据框

  14. 14

    R:删除数据框中重复的行,该数据框中的第二列包含一个值

  15. 15

    如何在R中按名称删除数据框中的行

  16. 16

    如何在R中按名称删除数据框中的行

  17. 17

    删除数据框(R)所有列中具有重复值的行

  18. 18

    根据上一行(R)的值删除数据框中的一行

  19. 19

    如何删除数据框中具有重复值的列?

  20. 20

    根据R中的条件删除数据框的列

  21. 21

    根据R中的日期删除数据框的行

  22. 22

    如何删除数据框中的所有行?

  23. 23

    如何查找和删除数据框中的重复项?

  24. 24

    如何删除数据框中的“不可用”

  25. 25

    如何删除数据框中的冗余行

  26. 26

    如何删除数据框中的停用词(Python)

  27. 27

    如何删除数据框中的换行符?

  28. 28

    如何删除数据框中的Hetrogenius元素?

  29. 29

    如何查找和删除数据框中的重复项?

热门标签

归档