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")
我有一个如下所示的数据框:
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
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")