在 R 中的数据帧中按行查找最大绝对值

Jinku Hu 2021年7月14日
在 R 中的数据帧中按行查找最大绝对值

本文将解释如何在 R 中的数据框中按行查找最大绝对值。

使用自定义函数在 R 数据框中按行查找最大绝对值

可以使用我们在以下代码片段中实现的 abs_max 函数在数据帧的每一行中查找最大绝对值并将它们构造为向量。我们假设数据框包含数字和非数字值,并初始化一个名为 df1 的对象以进行验证。abs_max 块中调用的第一个函数是 Filter。它需要两个参数。第一个表示应用于作为第二个参数传递的向量的每个元素的一元函数,而 Filter 提取评估 true 的元素。在这种情况下,Filter 采用 is.numeric 函数从数据框中仅提取数值。

然后,inherits 函数用于检查 abs_max 的参数是否为 tbl_df 类型,如果是,则将其转换为矩阵。请注意,tbl_df 类通常称为 tibble,并由一个单独的包提供相同的名称,我们将在下一个示例中使用它。replace 函数被调用以用它们的绝对值替换负值,用 -Inf 替换 NA 类型。接下来,max.col 被调用并提取每行中最大值的位置向量。最后,使用 cbind 函数获取结果值。我们可以将后一个对象作为名为 abs_max 的单独列附加到现有数据框中,如以下代码示例所示。

abs_max <- function(data) {
  tmp <- Filter(is.numeric, data)
  if(inherits(data, "tbl_df")) {
    tmp <- as.matrix(tmp)
  }
  tmp[cbind(1:nrow(tmp), max.col(replace(x <- abs(tmp), is.na(x), -Inf)))]
}

df1 <- data.frame(
  id = c("foo", "bar", "goo"),
  val_a =  c(-51, 15, 19),
  val_b = c(NA, 122, 35),
  val_c = c(10, -23, 4)
)

df1$abs_max = abs_max(df1)
df1

输出:

id val_a val_b val_c abs_max
1 foo   -51    NA    10     -51
2 bar    15   122   -23     122
3 goo    19    35     4      35

或者,可以使用相同的函数传递 tibble 对象类型并处理其行。请注意,tibbles 将在 abs_max 函数中转换为矩阵,但其余函数代码的工作方式与在数据帧上的工作方式相同。

library(tibble)

abs_max <- function(data) {
  tmp <- Filter(is.numeric, data)
  if(inherits(data, "tbl_df")) {
    tmp <- as.matrix(tmp)
  }
  tmp[cbind(1:nrow(tmp), max.col(replace(x <- abs(tmp), is.na(x), -Inf)))]
}

tb1 <- tibble(
  id = c("foo", "bar", "goo"),
  val_a =  c(-51, 15, 19),
  val_b = c(NA, 122, 35),
  val_c = c(10, -23, 4)
)

tb1$abs_max = abs_max(tb1)
tb1

输出:

# A tibble: 3 x 5
  id    val_a val_b val_c abs_max
  <chr> <dbl> <dbl> <dbl>   <dbl>
1 foo     -51    NA    10     -51
2 bar      15   122   -23     122
3 goo      19    35     4      35
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相关文章 - R Data Frame