问题描述
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