将选择范围重新调整为 0 - 1?

rescale the selective range into 0 - 1?

我有一个这样的数据框:

df <- data.frame(FC=c(1, 2, 4, 2, 1, -4, -2))

我正在尝试重新调整 0-1 之间的正值和 0- -1 之间的负值,因此输出将是:

 FC
0.25
 0.5
   1
 0.5
0.25
  -1
-0.5

我在 r

中尝试过“scales”包
df$FC <- rescale(df$FC, to = c(0, 1))

但它正在重新调整 0-1 之间的所有值。

如何根据各自的范围对列进行标准化?

非常感谢您提供的任何帮助。

您可以将数据分成正负两部分,然后分别处理。

df <- data.frame(FC=c(1, 2, 4, 2, 1, -4, -2))

library(scales)

df[which(df$FC>0),] <- rescale(df[which(df$FC>0),], to=c(.25,1))
df[which(df$FC<0),] <- rescale(df[which(df$FC<0),], to=c(-.5,-1))

df

输出:

     FC
1  0.25
2  0.50
3  1.00
4  0.50
5  0.25
6 -0.50
7 -1.00

但是请注意,我没有将范围指定为 0 到 1 之间,因为那样不会为您提供所需的输出。如果我这样做,输出将是这样的:

          FC
1  0.0000000
2  0.3333333
3  1.0000000
4  0.3333333
5  0.0000000
6  0.0000000
7 -1.0000000

这是一个基本的 R 选项

transform(
    df,
    FC_scaled = FC / abs(ifelse(FC > 0, max(FC), min(FC)))
)

这给出了

  FC FC_scaled
1  1      0.25
2  2      0.50
3  4      1.00
4  2      0.50
5  1      0.25
6 -4     -1.00
7 -2     -0.50

我们也可以使用具有与@ThomasIsCoding post

类似逻辑的sign
df$FC_scaled <- with(df, FC/setNames(range(FC),
           c(-1, 1))[as.character(sign(FC))] * sign(FC))

-输出

 df
  FC FC_scaled
1  1      0.25
2  2      0.50
3  4      1.00
4  2      0.50
5  1      0.25
6 -4     -1.00
7 -2     -0.50