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

Lasha Khintibidze 18 luglio 2021 14 luglio 2021 R R Data Frame
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

Articolo correlato - R Data Frame

  • Crea un frame di dati di grandi dimensioni in R
  • Rimuovi righe duplicate per colonna in R
  • Unisci due frame di dati con un numero diverso di righe in R
  • Combina due DataFrame in R
  • Contare il numero di osservazioni in R