楼主: gaoys
1460 5

[问答] 求教,分组获取离群值 [推广有奖]

  • 0关注
  • 0粉丝

大专生

26%

还不是VIP/贵宾

-

威望
0
论坛币
11 个
通用积分
0.0007
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
219 点
帖子
18
精华
0
在线时间
68 小时
注册时间
2017-12-27
最后登录
2019-12-27

楼主
gaoys 发表于 2018-3-11 08:35:42 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
数据如下:
       order_id           id   amount
1  LG1702041641     4181S02140      1
2  LG1703031037     8885219140      1
3  LG1703049385     8885219140      1
4  LG1709012218        1100062      2
5  LG1709012218      1100068-C      1
6  LG1707000721      1101100-C      1
7  LG1709012218      1102012-C      1
8  LG1705005349        1104018      1
9  LG1704009567        1106253      1
10 LG1705001498        1111010      2
11 LG1705009010      1112018-3      1
12 LG1709008198      1112071-3      1
13 LG1705011565      1112083-I      1
14 LG1709008198    1203007-074      1
15 LG1709019763    1203008-074      1
16 LG1708012039 12676000000968      1
17 LG1709014286    1301093-011      1
18 LG1709014286    1301105-042      1
19 LG1702030566    1301129-011      1
20 LG1701010911    1301135-011      1

要求按照id列,分组找出amount的离群值,返回离群值对应的行;
试了很久没搞定,哪位能帮忙解决一下?
多谢!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:离群值 amount Order AMO der

沙发
gaoys 发表于 2018-3-11 17:24:56
自己顶一下

藤椅
gaoys 发表于 2018-3-11 19:01:45
a<-by(trans1$amount,INDICES=list(trans1$id),function(x) boxplot.stats(trans1$amount)$out)
a<-tapply(trans1$amount,INDEX=trans1$id,function(x) boxplot.stats(trans1$amount)$out)
a<-aggregate(trans1$amount,by=list(trans1$id),function(x) boxplot.stats(trans1$amount)$out)
这三种方法输出的离群值,每组都是一样的,不是预期的每组不同?
> a
$`20122090547`
[1]  2  4 10  2  2  2  3  2  2  2  3  3  2  3  3  2  2 10  3  3 30 10 20

$`20122090548`
[1]  2  4 10  2  2  2  3  2  2  2  3  3  2  3  3  2  2 10  3  3 30 10 20

$`20122090559`
[1]  2  4 10  2  2  2  3  2  2  2  3  3  2  3  3  2  2 10  3  3 30 10 20

$`201D0127`
[1]  2  4 10  2  2  2  3  2  2  2  3  3  2  3  3  2  2 10  3  3 30 10 20

$`3010160235040`
[1]  2  4 10  2  2  2  3  2  2  2  3  3  2  3  3  2  2 10  3  3 30 10 20

$`3010226525041`
[1]  2  4 10  2  2  2  3  2  2  2  3  3  2  3  3  2  2 10  3  3 30 10 20

$`3010234419140`
[1]  2  4 10  2  2  2  3  2  2  2  3  3  2  3  3  2  2 10  3  3 30 10 20

$`3010234421140`
[1]  2  4 10  2  2  2  3  2  2  2  3  3  2  3  3  2  2 10  3  3 30 10 20

$`3010234425140`
[1]  2  4 10  2  2  2  3  2  2  2  3  3  2  3  3  2  2 10  3  3 30 10 20

已有 1 人评分论坛币 热心指数 收起 理由
cheetahfly + 10 + 1 热心帮助其他会员

总评分: 论坛币 + 10  热心指数 + 1   查看全部评分

板凳
gaoys 发表于 2018-3-11 19:05:29
a<-tapply(trans1$amount,INDEX=trans1$id,function(x) boxplot.stats(trans1$amount)$out)
a<-by(trans1,INDICES=list(trans1$id),function(x) boxplot.stats(trans1$amount)$stats)
a<-aggregate(trans1$amount,by=list(trans1$id),function(x) boxplot.stats(trans1$amount)$out)
这三种方法输出的离群值,每组都是一样的,不是预期的每组离群值不同,什么原因呢?
> a
$`20122090547`
[1]  2  4 10  2  2  2  3  2  2  2  3  3  2  3  3  2  2 10  3  3 30 10 20

$`20122090548`
[1]  2  4 10  2  2  2  3  2  2  2  3  3  2  3  3  2  2 10  3  3 30 10 20

$`20122090559`
[1]  2  4 10  2  2  2  3  2  2  2  3  3  2  3  3  2  2 10  3  3 30 10 20

$`201D0127`
[1]  2  4 10  2  2  2  3  2  2  2  3  3  2  3  3  2  2 10  3  3 30 10 20

$`3010160235040`
[1]  2  4 10  2  2  2  3  2  2  2  3  3  2  3  3  2  2 10  3  3 30 10 20

$`3010226525041`
[1]  2  4 10  2  2  2  3  2  2  2  3  3  2  3  3  2  2 10  3  3 30 10 20

$`3010234419140`
[1]  2  4 10  2  2  2  3  2  2  2  3  3  2  3  3  2  2 10  3  3 30 10 20

$`3010234421140`
[1]  2  4 10  2  2  2  3  2  2  2  3  3  2  3  3  2  2 10  3  3 30 10 20

$`3010234425140`
[1]  2  4 10  2  2  2  3  2  2  2  3  3  2  3  3  2  2 10  3  3 30 10 20

报纸
gaoys 发表于 2018-3-11 22:48:59
a<-aggregate(trans1$amount,by=list(trans1$id),function(x) boxplot.stats(x)$out)
可以得到分组的离群值;
可是,怎么返回原数据框的行数啊?
56      200D22A000086                                   
57      200D22A000768                                   
58           20115002                                   
59           20115007                                  2
60           20118001                                   
61           20118004                                   
62           20118005                                   
63        20120060099                                   
64        20122050455                                   
65        20122080129                                   
66        20122080155                                   
67        20122090547                                  2
68        20122090548                               2, 2
69        20122090559                                  2
70        20122990485                                   
71        20122990696                                   
72        20122990701                                   
73        20122990702                                   
74        20122990705                                   
75        20122990707                                   
76        20122990708                                   
77        20122990772                                   
78           201D0008                                   
79           201D0090                                   
80           201D0126                                  4
81           201D0127 2, 4, 2, 3, 2, 2, 2, 2, 2, 4, 6, 2

地板
gaoys 发表于 2018-3-13 14:50:44
自己搞了一下,还是用到了循环。不知道是否能用apply族解决掉?

by_id <- group_by(trans1, id)
a<-tapply(trans1$amount,INDEX=trans1$id,function(x) which(x > quantile(x, probs=c( .95), na.rm = T)))
a<-sapply(a,function(x) data.frame(x))  #ok,去掉list里面的各种层级的属性;
b<-lapply(attributes(by_id)$indices,function(x) x[1])
c<-list()
#定位离群值在trans1中的行号;
#length(a[],判断是否integer(0),即未返回离群值的list行
for (i in 1:length(a)){
    if(length(a[])==0){
      cat(names(a),"无离群值!\n")
    }else{
      cat(names(a),"离群值!",a[],"\n")
      #x<-unlist(b)+unlist(a)
      #append(c, list(x), after = length(c))
      c[]<-unlist(b)+unlist(a)
    }
}
c<-unlist(c)
#找出离群值的行
outliners<-filter(trans1,row.names(trans1) %in% c)

结果:
> filter(trans1,row.names(trans1) %in% c)
       order_id            id amount
1  LG1704038373       1301246      2
2  LG1701011735 2000111001040      4
3  LG1707015081 2000111003040      2
4  LG1709017568 2000872101140      2
5  LG1707015079      20115007      2
6  LG1710016114   20122090547      2
7  LG1710016114   20122090559      2
8  LG1705005503      201D0126      4
9  LG1701021722      201D0127      4
10 LG1701026290      201D0127      3
11 LG1703051912      201D0127      4
12 LG1704011982      201D0127      6

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-9 09:45