规范化R data.frame列

时间:2016-09-05 02:46:32

标签: r dataframe probability distribution rescale

假设我有以下数据:

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等操作的列表

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

1 个答案:

答案 0 :(得分:3)

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

对其进行标准化
x / sum(x)

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

你采取的转变:

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

仅将x重新标记为[0, 1],但不确保&#34;总和为1&#34;。

关于您的代码

此处无需使用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给你一个清单,这就是&#34; l&#34; in&#34; lapply&#34;是指。您可以使用unlist将该列表折叠为矢量;或者,您可以使用sapply,其中&#34; s&#34;暗示&#34;简化(如果可能)&#34;。