假设我有以下数据:
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
等操作的列表
是否有将此列转换为概率分布的有效方法?
答案 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;。