7

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

现在我有这样的东西......其中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() 但似乎无法让它工作。

4

3 回答 3

18

使用scale, ifdat是您的数据框的名称:

## 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))
于 2013-10-19T04:35:16.577 回答
5

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

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

rescale <- function(x) (x-min(x))/(max(x) - min(x)) * 100
dat <- rescale(dat)
于 2017-11-10T19:35:58.293 回答
0

rescale()scales 包中的功能对其他秤更简单和灵活。如果您出于某种原因想要从 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
于 2021-12-25T01:13:38.900 回答