Trouver les valeurs absolues maximales par ligne dans le bloc de données dans R

Jinku Hu 23 janvier 2022
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
Auteur: 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

Article connexe - R Data Frame