将正数和负数重新缩放为 [0, 1] 和 [-1, 0]

Rescale positive and negative numbers into [0, 1] and [-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))

我发现很少有像 这样的例子,但这只适用于单列,我的文件 运行 几乎有 2000 列,所以不可能在每一列上手动完成。

知道怎么做吗?

如有任何帮助,我们将不胜感激。提前致谢

你可以使用

library(dplyr)

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

这个returns

      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))))

这个returns

      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