R

Manipulation de données : quelques mini-fonctions

Divers

Les fonctions na.rm et rm.unused.levels sont maintenant disponibles dans le package questionr (à partir de la version 0.3.0).

Deux petites fonctions pour manipuler un tableau de données sous R.

Suppression des valeurs manquantes

na.rm <- function(x, v=NULL)
{
  if (!is.data.frame(x)) x <- as.data.frame(x)
  # Les variables a traiter sont specifiees ?
  if (is.null(v))
    v <- names(x)
  # Pour chaque variable specifie, suppression des observations si NA
  r <- x[complete.cases(x[v]),]
  return(r)
}

na.rm est similaire à na.omit sauf qu’il est possible de spécifier les variables à prendre en compte.

> df <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z= c("a",NA,"b"))

> df
  x  y    z
1 1  0    a
2 2 10 <NA>
3 3 NA    b

> na.omit(df)
  x y z
1 1 0 a

> na.rm(df)
  x y z
1 1 0 a

> na.rm(df, c("x","y"))
  x  y    z
1 1  0    a
2 2 10 <NA>

> na.rm(df, "z")
  x  y z
1 1  0 a
3 3 NA b

Suppression des modalités inutilisées d’un facteur

rm.unused.levels <- function(x, v=NULL)
{
  if (!is.data.frame(x)) x <- as.data.frame(x)
  # Les variables a traiter sont specifiees ?
  if (is.null(v))
    v <- names(x)
  # Pour chaque variable de type facteur, supression des levels inutilisés
  for (i in 1:length(x)) {
    if (is.factor(x[[i]]) & names(x)[i] %in% v) 
      x[[i]] <- factor(x[[i]])
  }
  return(x)
}

Il arrive parfois que l’on ait des facteurs avec des modalités non utilisées, par exemple après importation d’un fichier d’enquête ou après sélection d’un sous-échantillon. rm.unused.levels permet de ne conserver que les modalités d’un facteur attribuées à au moins une observation.

> df <- data.frame(v1=c("a","b","a","b"),v2=c("x","x","y","y"))
> df$v1 <- factor(df$v1,c("a","b","c"))
> df$v2 <- factor(df$v2,c("x","y","z"))

> str(df)
'data.frame':	4 obs. of  2 variables:
 $ v1: Factor w/ 3 levels "a","b","c": 1 2 1 2
 $ v2: Factor w/ 3 levels "x","y","z": 1 1 2 2

> str(rm.unused.levels(df))
'data.frame':	4 obs. of  2 variables:
 $ v1: Factor w/ 2 levels "a","b": 1 2 1 2
 $ v2: Factor w/ 2 levels "x","y": 1 1 2 2

> str(rm.unused.levels(df,"v1"))
'data.frame':	4 obs. of  2 variables:
 $ v1: Factor w/ 2 levels "a","b": 1 2 1 2
 $ v2: Factor w/ 3 levels "x","y","z": 1 1 2 2