标准化 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)".
假设我有以下数据:
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)".