R boxplot - 如何针对给定的上限和下限而不是最小值和最大值进行归一化

R boxplot - how to normalize against given high and low limits instead of min and max

我有几个测量值,尽管比例完全不同,但它们需要在同一个箱线图中显示。每个组(=测量类型)都有自己特定的高和低可接受限度。

数据应在 R 中标准化,以便所有组的下限始终为 -1,上限始终为 +1。然后我将设置 Y 轴,以便正确显示所有测量值。

到目前为止,我已经设法绘制了 min(NUM_VALUE) 为 -1 和 max(NUM_VALUE) 为 +1 的箱线图,但这不是我想要的最终结果。

假数据(只是table的一部分):

ITEMID      NAME    SERIALID    NUM_VALUE   LOWER_LIMIT UPPER_LIMIT
Itemcode1   group1  SN1000      62.1        50          80
Itemcode1   group1  SN1001      62.6        50          80
Itemcode1   group1  SN1002      63.9        50          80
Itemcode1   group2  SN1006      1526.79     1526        1528
Itemcode1   group2  SN1007      1526.799    1526        1528
Itemcode1   group3  SN1015      1815.09     1814        1816
Itemcode1   group3  SN1016      1815.094    1814        1816
Itemcode1   group3  SN1017      1815.098    1814        1816
Itemcode1   group4  SN1025      1526.751    1526        1527
Itemcode1   group4  SN1026      1526.62     1526        1527
Itemcode1   group5  SN1028      1816.155    1816        1817
Itemcode1   group5  SN1029      1816.245    1816        1817

R代码:

library(ggplot2)
library(data.table)
df <- read.table("data3.csv", header=TRUE, sep=";", stringsAsFactors=FALSE)
skl <- function(x){(x-min(x))/(max(x)-min(x))*2-1}
df <- transform(df,scaled=ave(df$NUM_VALUE,df$NAME,FUN=skl))
ggplot(df, aes(x=df$NAME, y = df$scaled)) + geom_boxplot()

到目前为止的图表: boxplot

我是 R 的新手。

问题:如何根据 UPPER_LIMIT 和 LOWER_LIMIT 按组缩放箱线图并将其全部显示在同一张图中?

非常感谢任何帮助,谢谢!

除了使用 min()max(),您还可以将函数 skl() 更改为也使用 lowerupper 边界。

适配函数如下所示:

skl <- function(x, lower, upper){
  (x - lower)/(upper - lower) * 2 - 1
}

您可以使用 apply() 遍历 data.frame 的行:

df$scaled <- apply(df[, 4:6], 1, function(row) {
  skl(x = row[1], lower = row[2], upper = row[3])
})

结果如下所示:

df$scaled
 [1] -0.19333333 -0.16000000 -0.07333333 -0.21000000 -0.20100000  0.09000000  0.09400000  0.09800000
 [9]  0.50200000  0.24000000 -0.69000000 -0.51000000

使用您的代码,箱线图将如下所示:

library(ggplot2)
ggplot(df, aes(x=df$NAME, y = df$scaled)) + geom_boxplot()