【问题标题】:Normalize data in R data.frame column规范化 R data.frame 列中的数据
【发布时间】:2017-01-12 09:25:21
【问题描述】:

假设我有以下数据:

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 这样的操作

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

【问题讨论】:

    标签: r dataframe probability distribution rescale


    【解决方案1】:

    假设您有一个向量x 具有非负值且没有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”表示“简化(如果可能)”。

    【讨论】:

      猜你喜欢
      • 2021-02-16
      • 2017-06-06
      • 2020-07-09
      • 2023-03-26
      • 2017-06-01
      • 2014-12-23
      • 1970-01-01
      • 2014-07-07
      相关资源
      最近更新 更多