如何根据R中另一列的权重重新缩放一列



我有一个数据帧,其中包括col1(计数(和col2(日期(

df<-data.frame(col1=c(1,2,3,4,16,0),col2=c('10-12-2019','11-12-2019','13-01-2020','14-02-2020','01-03-2020','01-04-2020'))

我想为唯一日期创建另一个基于col1的列范围(0-100(,但当我这样做时,它会给我随机数,而不是考虑col1 的权重

df$col3<-runif(df$col1,min=0,max=100)

怎么做?

这样做,对于col1中的每一个单位的增加,都会产生线性的恒定变化。

library(dplyr)
df %>% mutate(col3 = col1 * (100/max(col1)))
col1       col2   col3
1    1 10-12-2019   6.25
2    2 11-12-2019  12.50
3    3 13-01-2020  18.75
4    4 14-02-2020  25.00
5   16 01-03-2020 100.00
6    0 01-04-2020   0.00

也许您正在尝试在0-1之间缩放数字。你可以试试这个功能。

scale_0_to_1 <- function(x) (x-min(x, na.rm = TRUE))/
(max(x, na.rm = TRUE)-min(x, na.rm = TRUE))
df$col3 <- scale_0_to_1(df$col1)
df
#  col1       col2   col3
#1    1 10-12-2019 0.0625
#2    2 11-12-2019 0.1250
#3    3 13-01-2020 0.1875
#4    4 14-02-2020 0.2500
#5   16 01-03-2020 1.0000
#6    0 01-04-2020 0.0000

另一种选择是使用scales包中的rescale函数:

scales::rescale(df$col1) -> df$col3
# c  ol1       col2   col3
# 1    1 10-12-2019 0.0625
# 2    2 11-12-2019 0.1250
# 3    3 13-01-2020 0.1875
# 4    4 14-02-2020 0.2500
# 5   16 01-03-2020 1.0000
# 6    0 01-04-2020 0.0000

我们可以用range创建函数

scale_0_to_1 <- function(x) (x- min(x))/diff(range(x))
df$col3 <- scale_0_to_1(df$col1)
df$col3
#[1] 0.0625 0.1250 0.1875 0.2500 1.0000 0.0000

最新更新