你好,我有一个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_values
和test_df
的列顺序相同,你只需要逐行进行。令人恼火的是,apply
给出了行和颜色切换的结果。t
将它们切换回来。
如果函数中有多个参数,请使用mapply
:
mapply(normalize, test_df, max_values)