Finden Sie maximale Absolutwerte nach Zeile im DataFrame in R

Jinku Hu 23 Januar 2022
Finden Sie maximale Absolutwerte nach Zeile im DataFrame in R

In diesem Artikel wird erläutert, wie Sie maximale Absolutwerte pro Zeile in einem DataFrame in R finden.

Verwenden Sie die benutzerdefinierte Funktion, um maximale Absolutwerte pro Zeile im R-DataFrame zu finden

Das Finden der maximalen Absolutwerte in jeder Zeile des DataFrames und deren Konstruktion als Vektor kann mit der Funktion abs_max erfolgen, die wir im folgenden Codeausschnitt implementiert haben. Wir gehen davon aus, dass der DataFrame numerische und nicht-numerische Werte enthält und initialisieren zu Überprüfungszwecken ein Objekt namens df1. Die erste im abs_max-Block aufgerufene Funktion ist Filter. Es braucht zwei Argumente. Die erste stellt die unäre Funktion dar, die auf jedes Element des als zweites Argument übergebenen Vektors angewendet wird, und Filter extrahiert die Elemente, die true auswerten. In diesem Fall verwendet Filter die Funktion is.numeric, um nur numerische Werte aus dem DataFrame zu extrahieren.

Dann wird die Funktion inherits verwendet, um zu überprüfen, ob das Argument von abs_max vom Typ tbl_df ist, und wenn ja, wird es in eine Matrix umgewandelt. Beachten Sie, dass die Klasse tbl_df allgemein als tibble bekannt ist und von einem separaten Paket mit demselben Namen bereitgestellt wird, das wir im nächsten Beispiel verwenden werden. Die Funktion replace wird aufgerufen, um negative Werte durch ihren Absolutwert und die Typen NA durch -Inf zu ersetzen. Als nächstes wird max.col aufgerufen und extrahiert den Positionsvektor für die Maximalwerte in jeder Zeile. Abschließend werden die Ergebniswerte mit der Funktion cbind übernommen. Letzteres Objekt können wir als separate Spalte mit dem Namen abs_max an den bestehenden DataFrame anhängen, wie im folgenden Codebeispiel gezeigt.

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

Ausgabe:

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

Alternativ kann die gleiche Funktion verwendet werden, um den Objekttyp tibble zu übergeben und seine Zeilen zu verarbeiten. Beachten Sie, dass Tibbles in der Funktion abs_max in Matrizen umgewandelt werden, aber der Rest des Funktionscodes funktioniert genauso wie beim DataFrame.

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

Ausgabe:

# 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
Autor: 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 Facebook

Verwandter Artikel - R Data Frame