Normalize/scale 数据集

Normalize/scale data set

我有以下数据集:

dat<-as.data.frame(rbind(10,8,2,7,10,10,1,10,14,9,2,6,10,8,10,8,10,10,7,11,10))
colnames(dat)<-"Score"
print(dat)
Score
10
8
2
7
10
10
1
10
14
9
2
6
10
8
10
8
10
10
7
11
10

这些是学生获得的考试成绩,一个学生在这次考试中可以得到最高 15 或最低 0(顺便说一句,没有人得到最高或min), 然而在这个测试中获得的最低分数是1,最高分数是14.

现在,我想normalize/scale将此数据缩放到 0 到 20 之间。 如何在 excel 中实现这一点?或者在 R 中? 我的最终目标是将此测试中的分数标准化为上述等级,并将它们与另一组数据进行比较,其中最大值和最小值分别为 5 和 0。 如何正确比较这两个不同尺度的数据集?

我尝试了什么: 我在互联网上浏览了很多东西,然后想出了这个:

我从 wikipedia. 得到的 这个方法靠谱吗?

您可以在 R 中使用此命令在 0 到 20 之间缩放:

newvalue <- 20/(max(score)-min(score))*(score-min(score))

如果所有尺度的下限均为 0,则数学方法相当简单。

new_value = new_ceiling * old_value / old_ceiling

下一个公式将考虑每个等级的不同楼层:

new_value = new_floor + (new_ceiling - old_ceiling) * ((old_value-old_floor)/(old_ceiling-old_floor)) 这实际上是您从维基百科发布的公式。 ;)

希望对您有所帮助!

在你的情况下,我会使用你在问题中发布的特征比例公式。 (x - min(x)) / (max(x) - min(x)) 基本上会将您的测试标记转换为 0-1 之间的范围。

因为你的边确实是 0 和 15 而不是 2 和 14,你的 min(x)=0 和你的 max(x)=15。使用上述方法获得 0-1 之间的分数后,只需乘以 20。

tests <- read.table(header=T, file='clipboard')

tests2 <- (tests - 0) / (15 - 0) #or equally tests / 15

然后乘以 20 得到 0-20 之间的分数:

> tests2 * 20
       Score
1  13.333333
2  10.666667
3   2.666667
4   9.333333
5  13.333333
6  13.333333
7   1.333333
8  13.333333
9  18.666667
10 12.000000
11  2.666667
12  8.000000
13 13.333333
14 10.666667
15 13.333333
16 10.666667
17 13.333333
18 13.333333
19  9.333333
20 14.666667
21 13.333333

结果直观,功能可靠。例如得分为 14/15 的人应该得到最高分(并且非常接近 20),这里就是这种情况(转换后他们得分为 18.6666)。

在Excel中,如果您希望标准化数据的最小值为0,最大值为20,那么我们需要解决:

y = A * x + b

两分。

将原始数据的最大值放入C1:

=MAX(A:A)

将原始数据的最小值放入C2:

=MIN(A:A)

将所需的最大值放入 D1,将所需的最小值放入 D2。将 A 系数 的公式放入 C3:

=($D-$D)/($C-$C)

B系数C4中的公式:

=$D-$C*$C

最后将缩放公式放入B1:

=A1*$C+$C

并抄下来:

当然,如果您希望缩放比例独立于原始最大值或最小值,您可以在 C115 中使用 [= =37=]0 在 C2.

这很简单。由于这两个等级都是线性的,一个简单的倍数比率就可以完成这项工作。或者换句话说,你组中的每个等级都需要是 *20/15。

这里有一个小 r 函数,如果您需要重复该操作,它可以帮助您 运行 并让您可以灵活地重新缩放到什么。还必须注意 NA 值,因为 min()max() 默认情况下不会删除它们,然后 return NA。因此,我提供了一个选项来处理 NA 值(默认情况下删除它们)。

# function rescales data from 0 to 1 and optionally multiplies by new max
rescale <- function(x, new_max = 1, na.rm = T) {
  as.vector(new_max * scale(x, 
                  center = min(x, na.rm = na.rm), 
                  scale = (max(x, na.rm = na.rm) - min(x, na.rm = na.rm))))
  }

# old scores
scores <- c(10,8,2,7,10,10,1,10,14,9,2,6,10,8,10,8,10,10,7,11,10)

# new scores
data.frame(old = scores,
           new = rescale(scores, new_max = 20))
#>    old       new
#> 1   10 13.846154
#> 2    8 10.769231
#> 3    2  1.538462
#> 4    7  9.230769
#> 5   10 13.846154
#> 6   10 13.846154
#> 7    1  0.000000
#> 8   10 13.846154
#> 9   14 20.000000
#> 10   9 12.307692
#> 11   2  1.538462
#> 12   6  7.692308
#> 13  10 13.846154
#> 14   8 10.769231
#> 15  10 13.846154
#> 16   8 10.769231
#> 17  10 13.846154
#> 18  10 13.846154
#> 19   7  9.230769
#> 20  11 15.384615
#> 21  10 13.846154

reprex package (v2.0.1)

于 2022-03-10 创建