web-dev-qa-db-fra.com

Définition de <NA> sur vide

J'ai une trame de données avec une ligne NA:

 df = data.frame(c("classA", NA, "classB"), t(data.frame(rep("A", 5), rep(NA, 5), rep("B", 5))))
 rownames(df) <- c(1,2,3)
 colnames(df) <- c("class", paste("Year", 1:5, sep = ""))

 > df
   class Year1 Year2 Year3 Year4 Year5
1 classA     A     A     A     A     A
2   <NA>  <NA>  <NA>  <NA>  <NA>  <NA>
3 classB     B     B     B     B     B

J'ai introduit la ligne vide (ligne NA) exprès parce que je voulais avoir un peu d'espace entre la ligne classA et la ligne classB.

Maintenant, je voudrais remplacer le <NA> en blanc, de sorte que la deuxième ligne ressemble à une ligne vide.

J'ai essayé:

 df[is.na(df)] <- ""

et

 df[df == "NA"] <- ""

mais ça n'a pas marché ..

Des idées? Merci!

25
Mayou

Une autre alternative:

df <- sapply(df, as.character) # since your values are `factor`
df[is.na(df)] <- 0

Si vous voulez des blancs au lieu de zéros

> df <- sapply(df, as.character)
> df[is.na(df)] <- " "
> df
     class    Year1 Year2 Year3 Year4 Year5
[1,] "classA" "A"   "A"   "A"   "A"   "A"  
[2,] " "      " "   " "   " "   " "   " "  
[3,] "classB" "B"   "B"   "B"   "B"   "B"  

Si vous voulez un data.frame, utilisez simplement as.data.drame

> as.data.frame(df)
   class Year1 Year2 Year3 Year4 Year5
1 classA     A     A     A     A     A
2                                     
3 classB     B     B     B     B     B
33
Jilber Urbina

Cette réponse est plus un commentaire étendu.

Ce que vous essayez de faire n'est pas ce que je considérerais comme une bonne pratique. R n'est pas, par exemple, Excel, donc faire quelque chose comme ça juste pour créer une séparation visuelle dans vos données va juste vous donner des maux de tête plus tard.

Si vous ne vous souciez vraiment que de la sortie visuelle, je peux proposer deux suggestions:

  1. Utilisez le na.print argument à print lorsque vous souhaitez afficher les données avec cette séparation visuelle.

    print(df, na.print = "")
    #    class Year1 Year2 Year3 Year4 Year5
    # 1 classA     A     A     A     A     A
    # 2                                     
    # 3 classB     B     B     B     B     B
    
  2. Sachez que même ce qui précède n'est pas la meilleure suggestion. Obtenez à la fois visuel et conten séparation en convertissant votre data.frame vers un list:

    split(df, df$class)
    # $classA
    #    class Year1 Year2 Year3 Year4 Year5
    # 1 classA     A     A     A     A     A
    # 
    # $classB
    #    class Year1 Year2 Year3 Year4 Year5
    # 3 classB     B     B     B     B     B
    
9