在 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