楼主: 治感冒
12561 7

[问答] 如何提取boxplot里的异常值序列 [推广有奖]

  • 1关注
  • 1粉丝

博士生

82%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0.0036
学术水平
2 点
热心指数
2 点
信用等级
1 点
经验
341 点
帖子
178
精华
0
在线时间
452 小时
注册时间
2007-3-9
最后登录
2020-1-8

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
现有一个data.frame,通过画boxplot发现了在不同的factor下,均存在异常值。我想把这些异常值序列给提取出来。不知如何实现?

谢谢!
二维码

扫码加我 拉你入群

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

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

关键词:BOXPLOT 如何提取 plot box 异常值 如何

沙发
biohuang 发表于 2015-6-29 17:53:16 |只看作者 |坛友微信交流群
boxplot()有返回值,是个list,提取其中的out和group就是。
  1. bp <- boxplot(x)

  2. bp$out
  3. bp$group
复制代码
已有 2 人评分经验 论坛币 收起 理由
李会超 + 20 热心帮助其他会员
admin_kefu + 20 热心帮助其他会员

总评分: 经验 + 20  论坛币 + 20   查看全部评分

使用道具

藤椅
治感冒 发表于 2015-6-29 21:13:52 |只看作者 |坛友微信交流群
biohuang 发表于 2015-6-29 17:53
boxplot()有返回值,是个list,提取其中的out和group就是。
你这方法非常方便!谢谢!但是这样返回的是一个向量,我想根据这个向量再找值对应的名称。比如说,有这样两个数据:

a <- c(4,3,2,1)
b <- c(3,1,4)

我需要找到b中元素在a中的位置,怎么做呢?试了半天也不会。因为我如果提取到a对应数字的位子,我就能根据a中数据的位置,去找a在的dataframe里其他的对应数据了。

使用道具

板凳
biohuang 发表于 2015-6-30 09:25:59 |只看作者 |坛友微信交流群
这个貌似就没法直接用boxplot()了。你可以用别的方法找到outlier,也可以利用boxplot()返回的结果用which()或match()去找outlier的位置。

使用道具

报纸
治感冒 发表于 2015-6-30 10:53:56 |只看作者 |坛友微信交流群
biohuang 发表于 2015-6-30 09:25
这个貌似就没法直接用boxplot()了。你可以用别的方法找到outlier,也可以利用boxplot()返回的结果用which() ...
我也是想了半天没有直接的办法。所以才想通过找到outlier,根据outlier返回的值去寻找源数据。我现在的一个比较笨的方法是把outlier转换成data.frame, 然后把这个data.frame和我的源data.frame,按outlier的列名用merge方法,提取outlier的源信息。
你提到的which()方法,我试了半天都不成功。which()的判断语句里,is.na、对比一个数值都比较好用,例如which(is.na(x)), which(x >/=/< 4)等等都能方便提取对应判断条件的下标,但是用which判断等于某一向量的时候就报错。例如我上面提到的例子,

a <- c(9,8,7,6,5)
b <- c(9,6,5)

我想提取a中9,6,5的下表位置,用which(a == b)就不行。不知道你有没有好的解决方法?毕竟which用起来很方便。。。

使用道具

地板
biohuang 发表于 2015-7-1 16:33:56 |只看作者 |坛友微信交流群
治感冒 发表于 2015-6-30 10:53
我也是想了半天没有直接的办法。所以才想通过找到outlier,根据outlier返回的值去寻找源数据。我现在的一 ...
  1. index.a.outlier <- list()
  2. for (ib in b) {
  3.     index.a.outlier[[ib]] <- (1:length(a))[b[ib]==a]
  4. }
复制代码
这代码很丑很慢,而且有几个outlier相等的话还要另外处理……不过我想不到别的办法。

换个思路,其实outlier就是太大或太小的数,下面是比较清爽的解法
  1. bp <- boxplot(x)
  2. five.stats <- bp$stats
  3. min.x <- five.stats[1,]
  4. max.x <- five.stats[5,]
复制代码
这里面min.x和max.x的长度都等于x的分组数。然后每一组里面,小于min.x或大于max.x的数就是outlier
已有 1 人评分论坛币 收起 理由
admin_kefu + 10 热心帮助其他会员

总评分: 论坛币 + 10   查看全部评分

使用道具

7
lpclimber 发表于 2016-2-4 09:16:08 |只看作者 |坛友微信交流群
谢谢各位的分享!!

使用道具

8
402829154 发表于 2019-11-8 17:00:10 |只看作者 |坛友微信交流群
如果想用which找到b中元素在a中的位置,可以尝试用which(b[i]==a)

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-26 22:32