Trova i valori assoluti massimi per riga nel frame di dati in R
Questo articolo spiegherà come trovare i valori assoluti massimi per riga in un frame di dati in R.
Usa la funzione personalizzata per trovare i valori assoluti massimi per riga nel frame di dati R
Trovare i valori assoluti massimi in ogni riga del frame di dati e costruirli come vettore può essere fatto usando la funzione abs_max
che abbiamo implementato nel seguente frammento di codice. Assumiamo che il frame di dati contenga valori numerici e non numerici e inizializziamo un oggetto chiamato df1
a scopo di verifica. La prima funzione richiamata nel blocco abs_max
è Filter
. Ci vogliono due argomenti. Il primo rappresenta la funzione unaria applicata a ciascun elemento del vettore passato come secondo argomento, e Filter
estrae gli elementi che valutano true
. In questo caso, Filter
utilizza la funzione is.numeric
per estrarre solo valori numerici dal frame di dati.
Quindi, la funzione inherits
viene utilizzata per verificare se l’argomento di abs_max
è di tipo tbl_df
, e in caso affermativo viene convertito in una matrice. Si noti che la classe tbl_df
è comunemente nota come tibble
ed è fornita con lo stesso nome da un pacchetto separato, che utilizzeremo nel prossimo esempio. La funzione replace
viene chiamata per sostituire i valori negativi con il loro valore assoluto ei tipi NA
con -Inf
. Il successivo, max.col
viene richiamato ed estrae il vettore di posizioni per i valori massimi in ogni riga. Infine, i valori dei risultati vengono rilevati utilizzando la funzione cbind
. Quest’ultimo oggetto possiamo aggiungere al frame di dati esistente come una colonna separata denominata abs_max
, come dimostrato nel seguente esempio di codice.
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
Produzione:
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
In alternativa, la stessa funzione può essere utilizzata per passare il tipo di oggetto tibble
ed elaborare le sue righe. Si noti che i tibble verranno convertiti in matrici nella funzione abs_max
, ma il resto del codice della funzione funziona allo stesso modo sul frame di dati.
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
Produzione:
# 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