标记R中的箱形图离群值

rmbxnbpk  于 2023-02-26  发布在  其他
关注(0)|答案(1)|浏览(157)

我有一个包含130行(人ID)和169列(基因名称)的数据框。我已经能够使用以下代码为每个人创建一个箱线图。例如,我的数据框看起来像这样,每个人的每个基因的基因表达:

| ID|  gene X  |  gene Y  |  gene Z |
| A |   0.50   |   0.78   |   0.86  |
| B |   0.45   |   0.52   |   0.94  |
| C |   0.48   |   0.53   |   0.05  |
lapply(seq_along(tpose_genexp), function(x){
 boxplot(tpose_genexp[[x]], 
         horizontal = FALSE, # Horizontal or vertical plot
         lwd = 2, # Lines width
         col = rgb(1, 0, 0, alpha = 0.4), # Color
         main = paste("", colnames(tpose_genexp))[[x]],
         notch = TRUE, 
         border = "black",
         outpch = 25,       # Outliers symbol
         outbg = "green",   # Outliers color
         whiskcol = "blue", # Whisker color
         whisklty = 2,      # Whisker line type
         lty = 1,
         outl) # Line type (box and median)
})

这给了我169个箱线图。我正在想办法用id来标记离群值,id是行名。

我试着使用lapply和其他几个选项,但似乎无法让它们工作。

h79rfbju

h79rfbju1#

以下是绘制离群值行名称的方法。
我将使用包ggplot2中的数据集mpg,因为一些数值列有异常值,而其中一个没有。lapply循环之前的数据子集化代码旨在使代码可重复。

data(mpg, package = "ggplot2")
i_num <- which(sapply(mpg, is.numeric))
str(mpg[i_num])
#> Classes 'tbl_df', 'tbl' and 'data.frame':    234 obs. of  5 variables:
#>  $ displ: num  1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
#>  $ year : int  1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
#>  $ cyl  : int  4 4 4 4 6 6 6 4 4 4 ...
#>  $ cty  : int  18 21 20 21 16 18 18 18 16 20 ...
#>  $ hwy  : int  29 29 31 30 26 26 27 26 25 28 ...
i_num <- i_num[c(1, 4, 5)]

lapply(names(mpg[i_num]), \(x) {
  bp <- boxplot(mpg[[x]], 
                horizontal = FALSE, # Horizontal or vertical plot
                lwd = 2, # Lines width
                col = rgb(1, 0, 0, alpha = 0.4), # Color
                main = x,
                notch = TRUE, 
                border = "black",
                outpch = 25,       # Outliers symbol
                outbg = "green",   # Outliers color
                whiskcol = "blue", # Whisker color
                whisklty = 2,      # Whisker line type
                lty = 1            # Line type (box and median)
                #, outl            # ??? (it's in the question's code)
  )
  i_row <- which(mpg[[x]] %in% bp$out)
  labs <- if(length(i_row)) {
    tapply(row.names(mpg)[i_row], bp$out, paste, collapse = ", ")
  } else ""
  text(1.1, unique(bp$out), labels = labs, pos = 4)
})

第一个c0d1x第一个c1d1x第一个c2d1x

#> [[1]]
#> NULL
#> 
#> [[2]]
#> NULL
#> 
#> [[3]]
#> NULL

创建于2023年2月25日,使用reprex v2.0.2

相关问题