标准化 R data.frame 列中的数据

Normalize data in R data.frame column

假设我有以下数据:

a <- data.frame(var1=letters,var2=runif(26))

假设我想缩放 var2 中的每个值,使得 var2 列的总和等于 1(基本上将 var2 列转换为概率分布)

我试过以下方法:

a$var2 <- lapply(a$var2,function(x) (x-min(a$var2))/(max(a$var2)-min(a$var2)))

这不仅给出了大于 1 的总和,而且还将 var2 列变成了一个列表,我无法对其进行 sum

等操作

是否有任何有效的方法可以将此列转换为概率分布?

假设您有一个具有非负值且没有 NA 的向量 x,您可以通过

对其进行归一化
x / sum(x)

这是一个适当的概率质量函数。

您进行的变换:

(x - min(x)) / (max(x) - min(x))

仅将 x 重新缩放到 [0, 1],但不确保 "summation to 1"。


关于你的代码

这里不用lapply:

lapply(a$var2, function(x) (x-min(a$var2)) / (max(a$var2) - min(a$var2)))

只用向量化运算

a$var2 <- with(a, (var2 - min(var2)) / (max(var2) - min(var2)))

正如你所说,lapply给你一个列表,这就是"lapply"中的"l"所指的。您可以使用 unlist 将该列表折叠成一个向量;或者,您可以使用 sapply,其中 "s" 表示 "simplification (when possible)".