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

问题描述

我有一个这样的数据框:

df <- data.frame(FC=c(1,2,4,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 之间的所有值。

如何按列的单个范围对列进行标准化?

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

解决方法

这是一个基本的 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
,

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

df <- data.frame(FC=c(1,2,4,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

,

我们也可以使用与@ThomasIsCoding 帖子中类似逻辑的 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