Encuentre valores absolutos máximos por fila en el DataFrame en R

Jinku Hu 23 enero 2022
Encuentre valores absolutos máximos por fila en el DataFrame en R

Este artículo explicará cómo encontrar valores absolutos máximos por fila en un DataFrame en R.

Utilice la función personalizada para encontrar valores absolutos máximos por fila en el DataFrame R

Encontrar valores absolutos máximos en cada fila del DataFrame y construirlos como un vector se puede hacer usando la función abs_max que implementamos en el siguiente fragmento de código. Suponemos que el DataFrame contiene valores numéricos y no numéricos e inicializamos un objeto llamado df1 para fines de verificación. La primera función llamada en el bloque abs_max es Filter. Se necesitan dos argumentos. El primero representa la función unaria aplicada a cada elemento del vector pasado como segundo argumento, y Filter extrae los elementos que evalúan true. En este caso, Filter toma la función is.numeric para extraer solo valores numéricos del DataFrame.

Luego, la función inherits se utiliza para verificar si el argumento de abs_max es del tipo tbl_df, y si es así, se convierte en un array. Tenga en cuenta que, la clase tbl_df se conoce comúnmente como tibble y se proporciona con el mismo nombre en un paquete separado, que utilizaremos en el siguiente ejemplo. La función replace se llama para reemplazar los valores negativos con su valor absoluto y los tipos NA con -Inf. El siguiente, max.col se invoca y extrae el vector de posiciones para los valores máximos en cada fila. Finalmente, los valores de resultado se toman usando la función cbind. El último objeto lo podemos agregar al DataFrame existente como una columna separada llamada abs_max como se demuestra en el siguiente ejemplo de código.

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

Producción :

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

Alternativamente, la misma función se puede utilizar para pasar el tipo de objeto tibble y procesar sus filas. Tenga en cuenta que tibbles se convertirá en matrices en la función abs_max, pero el resto del código de la función funciona de la misma manera que lo hizo en el 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

Producción :

# 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

Artículo relacionado - R Data Frame