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