将正数和负数重新缩放为[0,1]和[-1,0] [英] Rescale positive and negative numbers into [0, 1] and [-1, 0]

查看:19
本文介绍了将正数和负数重新缩放为[0,1]和[-1,0]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个这样的数据框:

Input_df <- data.frame(Enl_ID = c("INTS121410", "INTS175899", "INTS171428", "INTS156006", "INTS196136", "INTS114771" ), `CN4244` = c(5, 0, -0.4, -0.6, 10, 2), `CN4249` = c(10, -4, -10, -2, 6, 0), `CN4250` = c(40, 10, 4, -10, 0, 4))

我尝试重新调整0-1之间的正值和0-1之间的负值,以便输出类似

Output_df <- data.frame(Enl_ID = c("INTS121410", "INTS175899", "INTS171428", "INTS156006", "INTS196136", "INTS114771" ), `CN4244` = c(0.5, 0, -0.66, -1, 1, 0.2), `CN4249` = c(1, -0.4, -1, -0.2, 0.6, 0), `CN4250` = c(1, 0.25, 0.1, -1, 0, 0.1))

我发现像at stackoverflow这样的例子很少,但这只针对单列,而我的文件几乎运行到2000列,所以不可能对每一列都手动执行。

您知道怎么做吗?

任何帮助都将不胜感激。提前感谢

推荐答案

您可以使用

library(dplyr)

Input_df %>% 
  mutate(across(starts_with("CN"), ~.x / max(abs(.x))))

这将返回

      Enl_ID CN4244 CN4249 CN4250
1 INTS121410   0.50    1.0   1.00
2 INTS175899   0.00   -0.4   0.25
3 INTS171428  -0.04   -1.0   0.10
4 INTS156006  -0.06   -0.2  -0.25
5 INTS196136   1.00    0.6   0.00
6 INTS114771   0.20    0.0   0.10

或者,如果您需要正值和负值的不同调整因子:

Input_df %>% 
  mutate(across(starts_with("CN"), 
                ~case_when(.x >= 0 ~ .x / max(.x), 
                           TRUE ~ - .x / min(.x))))

这将返回

      Enl_ID     CN4244 CN4249 CN4250
1 INTS121410  0.5000000    1.0   1.00
2 INTS175899  0.0000000   -0.4   0.25
3 INTS171428 -0.6666667   -1.0   0.10
4 INTS156006 -1.0000000   -0.2  -1.00
5 INTS196136  1.0000000    0.6   0.00
6 INTS114771  0.2000000    0.0   0.10

这篇关于将正数和负数重新缩放为[0,1]和[-1,0]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆