1

假设我有以下数据:

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

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

4

1 回答 1

4

假设您有一个x具有非负值且 no的向量NA,您可以通过以下方式对其进行归一化

x / sum(x)

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

你采取的转变:

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

仅重新调整x[0, 1],但不确保“总和为 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”表示“简化(如果可能)”。

于 2016-09-05T02:50:05.353 回答