R:使用绝对值比较值但打印有符号值

R: compare values using absolute value but print signed value

我有一个如下所示的数据框:

ID    val1    val2    val3
A07   -0.01   -0.03   0.01
A08   0.05    -0.07   0.02
B01   0.02    0.03    -0.01

对于每一行,我想确定列 val1、val2 和 val3 中的最大绝对值。然后我想将最大绝对值的带符号值(例如,最初格式化的整数)打印到新列。结果将如下所示:

ID    val1    val2    val3    val.new
A07   -0.01   -0.03   0.01    -0.03
A08   0.05    -0.07   0.02    -0.07
B01   0.04    0.02    -0.01   0.04

我目前正在使用 apply 来识别所需列中每一行的最大绝对值并打印到新列,如下所示:

df[,"val.new"] = apply(abs(df[,2:4]), 1, max)

但这当然是 return 最大绝对值,没有符号:

ID    val1    val2    val3    val.new
A07   -0.01   -0.03   0.01    0.03
A08   0.05    -0.07   0.02    0.07
B01   0.04    0.02    -0.01   0.04

我不知道如何 return 用于标识最大值的有符号值。我该如何解决?

谢谢!

你可以这样做:

df$val.new <- apply(df[-1], 1, function(x) x[which.max(abs(x))])

df
#>    ID  val1  val2  val3 val.new
#> 1 A07 -0.01 -0.03  0.01   -0.03
#> 2 A08  0.05 -0.07  0.02   -0.07
#> 3 B01  0.02  0.03 -0.01    0.03

使用的数据

df <- structure(list(ID = structure(1:3, .Label = c("A07", "A08", "B01"
), class = "factor"), val1 = c(-0.01, 0.05, 0.02), val2 = c(-0.03, 
-0.07, 0.03), val3 = c(0.01, 0.02, -0.01)), row.names = c(NA, 
-3L), class = "data.frame")

df
#>    ID  val1  val2  val3
#> 1 A07 -0.01 -0.03  0.01
#> 2 A08  0.05 -0.07  0.02
#> 3 B01  0.02  0.03 -0.01

我们可以在 base R

中使用矢量化 row/column 索引
df$val.new <-  df[-1][cbind(seq_len(nrow(df)), max.col(abs(df[-1]), 'first'))]

-输出

df
#   ID  val1  val2  val3 val.new
#1 A07 -0.01 -0.03  0.01   -0.03
#2 A08  0.05 -0.07  0.02   -0.07
#3 B01  0.02  0.03 -0.01    0.03

数据

df <- structure(list(ID = structure(1:3, .Label = c("A07", "A08", "B01"
), class = "factor"), val1 = c(-0.01, 0.05, 0.02), val2 = c(-0.03, 
-0.07, 0.03), val3 = c(0.01, 0.02, -0.01)), row.names = c(NA, 
-3L), class = "data.frame")