Trova i valori assoluti massimi per riga nel frame di dati in R

Jinku Hu 18 luglio 2021
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
Autore: 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

Articolo correlato - R Data Frame