Trouver les valeurs absolues maximales par ligne dans le bloc de données dans R
Cet article explique comment trouver des valeurs absolues maximales par ligne dans une DataFrame dans R.
Utilisez la fonction personnalisée pour rechercher les valeurs absolues maximales par ligne dans la DataFrame R
Trouver des valeurs absolues maximales dans chaque ligne du bloc de données et les construire en tant que vecteur peut être effectué à l’aide de la fonction abs_max
que nous avons implémentée dans l’extrait de code suivant. Nous supposons que la DataFrame contient des valeurs numériques et non numériques et initialisons un objet appelé df1
à des fins de vérification. La première fonction appelée dans le bloc abs_max
est Filtre
. Il faut deux arguments. Le premier représente la fonction unaire appliquée à chaque élément du vecteur passé en second argument, et Filter
extrait les éléments qui évaluent true
. Dans ce cas, Filter
utilise la fonction is.numeric
pour extraire uniquement les valeurs numériques de la DataFrame.
Ensuite, la fonction inherits
est utilisée pour vérifier si l’argument de abs_max
est de type tbl_df
, et si c’est le cas, il est converti en matrice. Notez que la classe tbl_df
est communément appelée tibble
et est fournie avec le même nom par un package séparé, que nous utiliserons dans l’exemple suivant. La fonction replace
est appelée pour remplacer les valeurs négatives par leur valeur absolue et les types NA
par -Inf
. Le suivant, max.col
est invoqué et extrait le vecteur des positions pour les valeurs maximales dans chaque ligne. Enfin, les valeurs des résultats sont prises à l’aide de la fonction cbind
. Ce dernier objet, nous pouvons l’ajouter au bloc de données existant en tant que colonne distincte nommée abs_max
, comme illustré dans l’exemple de code suivant.
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
Production:
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
Alternativement, la même fonction peut être utilisée pour passer le type d’objet tibble
et traiter ses lignes. Notez que les tibbles seront convertis en matrices dans la fonction abs_max
, mais le reste du code de la fonction fonctionne de la même manière que sur la 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
Production:
# 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