【问题标题】:How can i rescale every column in my data frame to a 0-100 scale? (in r)如何将数据框中的每一列重新缩放为 0-100 比例? (在 r 中)
【发布时间】:2013-10-28 01:04:05
【问题描述】:

我正在尝试让我的数据框的所有列都处于相同的比例..

现在我有这样的东西......其中a的比例为0-1,b的比例为100,c的比例为1-5

a   b     c 
0   89   4 
1   93   3 
0   88   5

我怎样才能把它变成这样的 100scale...

a     b      c 
0     89     80 
100   93     60 
0     88     100 

我希望这有点清楚.. 我试过 scale() 但似乎无法让它工作。

【问题讨论】:

标签: r scaling


【解决方案1】:

scales 包中的rescale() 函数对于其他音阶来说更加简单和灵活。如果您出于某种原因想要从 3 扩展到 50,您可以在此处将 to 参数设置为 c(3,50) 而不是 c(0,100)。此外,如果您的数据需要适合另一个数据集的规模(即数据的最小/最大值不应等于您要设置的规模的最小值/最大值),您可以设置 from 参数。在这里,我提供了一个示例,其中 0 将是 -100 到 100 之间的中点,因此重新缩放到 0:100 现在会将 0 置于 50(中点)。

# 0 to 100 scaling
rescale(1:10, to = c(0,100))
# [1]   0.00000  11.11111  22.22222  33.33333  44.44444  55.55556  66.66667  77.77778  88.88889
# [10] 100.00000

# use 'from' to indicate the extended range of values
rescale(seq(0,100,10), to = c(0,100), from = c(-100,100))
# [1]  50  55  60  65  70  75  80  85  90  95 100

【讨论】:

    【解决方案2】:

    我的经验是,这仍然没有答案,如果其中一列有 -2,当前的答案不会产生 0-100 的比例。虽然我很欣赏这个答案,但当我尝试它时,我有 -100 到 100 的变量,这仍然留下了一些负数?

    如果这适用于您,我有一个解决方案:

    rescale <- function(x) (x-min(x))/(max(x) - min(x)) * 100
    dat <- rescale(dat)
    

    【讨论】:

      【解决方案3】:

      使用scale,如果dat 是您的数据框的名称:

      ## for one column
      dat$a <- scale(dat$a, center = FALSE, scale = max(dat$a, na.rm = TRUE)/100)
      ## for every column of your data frame
      dat <- data.frame(lapply(dat, function(x) scale(x, center = FALSE, scale = max(x, na.rm = TRUE)/100)))
      

      对于这样一个简单的情况,您也可以编写自己的函数。

      fn <- function(x) x * 100/max(x, na.rm = TRUE)
      fn(c(0,1,0))
      # [1]   0 100   0
      ## to one column
      dat$a <- fn(dat$a)
      ## to all columns of your data frame
      dat <- data.frame(lapply(dat, fn))
      

      【讨论】:

      • 这似乎有效,但我的所有 0-1 比例列都返回 NA
      • 可能将na.rm = TRUE 添加到max 会有所帮助。虽然如果不查看您的数据我无法确定。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多