【问题标题】:Boxplot label outliers according to third variable根据第三个变量的箱线图标签异常值
【发布时间】:2016-07-18 14:17:47
【问题描述】:

我正在尝试创建一个箱线图,其中异常值根据第三个变量而不是行名进行标记。

我的数据如下所示:(现在已编辑为包含多个国家和部门作为因子变量)

country <- c(rep(LETTERS[1:5],2))
sector <- rep(c("one", "two"),5)
set.seed(200)
value <- round(rnorm(10),2)
dat <- data.frame(country,sector,value)
dat

   country sector value
1        A    one  0.08
2        B    two  0.23
3        C    one  0.43
4        D    two  0.56
5        E    one  0.06
6        A    two -0.11
7        B    one -1.02
8        C    two -0.30
9        D    one  0.17

10 E 二 1.42

没有标签的箱线图是这样的:

boxplot(value ~ sector, data=dat)

我希望异常点上的标签能够反映变量国家/地区的值。

我在这里发现了一个类似的问题:Labeling outliers on boxplot in R,我正在尝试修改代码如下:

bxpdat <- boxplot(value ~ sector, data=dat)
text(bxpdat$group+0.2,                                           
bxpdat$out,                                                 
dat$country[which( dat$value == bxpdat$out, arr.ind=TRUE)[, 1]])  

但是我似乎做错了什么,因为这不起作用。我将不胜感激有关如何修复此代码的建议,

提前致谢!

【问题讨论】:

  • 您好,非常感谢您的回复!它确实适用于我在此处提供的示例数据,但是在我的真实数据上它不起作用......也许这是因为原始数据有更多的国家。例如,当我尝试使用您提供的代码将变量 country 定义为 country &lt;- c(rep(LETTERS[1:5],2)) 时,它为两种情况编写了相同的标签...
  • 您尝试过@MichaelChirico 解决方案吗?这也应该适用于您的真实数据

标签: r label boxplot


【解决方案1】:

微调:

x <- boxplot(value ~ sector, data=dat)

text(x$group, x$out,
     labels=subset(dat, sector %in% x$group & 
                     value %in% x$out)$country, pos=4)

这不是一个很好的通用解决方案,因为subset 匹配可能会不小心碰到其他点。这会更好,但我不确定如何在base

library(data.table); setDT(dat, key = c("sector", "value"))

dat[ , {
  x <- boxplot(value ~ sector, data=dat)
  with(x, text(group, out, .SD[.(group, out), country], pos = 4))}]

【讨论】:

  • @Cath 有不同的国家值,你是说?
  • 在这种情况下,调整为.SD[.(group, out), paste(country, collapse = ", "), by = .(sector, value)],但正如你所说,这不太可能
  • 非常感谢,即使我对更多国家/地区重新定义,基本建议也适用于示例数据。我现在将尝试使用原始数据集。如果存在相同的值但它们不是异常值(例如在其他部门),我是否理解正确? data.table 解决方案是否避免了这种情况?
  • @ZMacarozzi 我相信是这样,但前提是那些其他部门有异常值(在不同的值)。 data.table 解决方案专为处理此问题而定制。
  • 我能否再问一个细节:我无法将基本解决方案应用于我自己的数据集,因为在我的数据中,扇区是一个因子而不是整数;因此,在示例数据集中,如果我将扇区定义为 sector &lt;- rep(c("one","two"),5) 并运行您的代码,则会收到如下错误:Error in text.default(x$group, x$out, labels = subset(dat, sector %in% : zero-length 'labels' specified。有没有办法使基本解决方案适应一个因素?我现在也将尝试 data.table 解决方案。谢谢!
猜你喜欢
  • 2017-03-21
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
  • 2020-08-27
相关资源
最近更新 更多