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
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