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
并抄下来:
当然,如果您希望缩放比例独立于原始最大值或最小值,您可以在 C1 和 15 中使用 [= =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 创建
我有以下数据集:
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
并抄下来:
当然,如果您希望缩放比例独立于原始最大值或最小值,您可以在 C1 和 15 中使用 [= =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 创建