规范化一个数据框,每一列有一个特定的最大值,这个最大值不在数据集中



你好,我有一个20列的数据框架,但这里是一个可复制的副本:

test_df <- data.frame(a = sample(1:20,7), b = sample(1:50,7), c= sample(1:29,7) )
max_values <- c(20,50,29)

我想用它的"max_values"的相应索引规范化每列,请不要假设每列的最大值将等于我希望该列被规范化的最大值。如果它大于1小于0也没关系。最大值是阈值,我想观察我的数据是如何超过或低于它的。我们可以假设最小值总是0,所以我把它们从等式中去掉:

normalize <- function(x,y) {
return ((x - 0) / (y - 0))
}
lapply(test_df, normalize)

我已经编写了上面的代码,但是我不知道如何设置它,以便每次迭代对应于"max_values">

的不同索引

您可以使用scale

scale(test_df, center = FALSE, scale = max_values)
#         a    b         c
#[1,] 0.85 0.98 0.4827586
#[2,] 0.25 0.94 0.6896552
#[3,] 0.05 0.48 0.8965517
#[4,] 0.50 0.14 0.6206897
#[5,] 0.20 0.72 0.5172414
#[6,] 0.10 0.50 0.1034483
#[7,] 1.00 0.74 0.3103448
#attr(,"scaled:scale")
#[1] 20 50 29

或者除以一个列表

test_df / as.list(max_values)

set.seed(42)
test_df <- data.frame(a = sample(1:20, 7),
b = sample(1:50, 7),
c = sample(1:29, 7))

试试这个:

t(apply(test_df,1,function(x) x/max_values))
a    b         c
[1,] 0.40 0.74 0.7586207
[2,] 0.65 0.40 0.6206897
[3,] 0.50 0.70 0.2413793
[4,] 0.60 1.00 0.9310345
[5,] 0.10 0.04 0.6551724
[6,] 0.95 0.80 0.8275862
[7,] 0.20 0.66 0.1034483

只要max_valuestest_df的列顺序相同,你只需要逐行进行。令人恼火的是,apply给出了行和颜色切换的结果。t将它们切换回来。

如果函数中有多个参数,请使用mapply:

mapply(normalize, test_df, max_values)

最新更新