我试图让我的数据框的所有列都处于相同的比例..
现在我有这样的东西......其中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() 但似乎无法让它工作。
使用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))
我的经验是,这仍然没有答案,如果其中一列有 -2,当前的答案不会产生 0-100 的比例。虽然我很欣赏这个答案,但当我尝试它时,我有 -100 到 100 的变量,这仍然留下一些负数?
如果这适用于您,我有一个解决方案:
rescale <- function(x) (x-min(x))/(max(x) - min(x)) * 100
dat <- rescale(dat)
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