if colonne n'existe pas, la créer

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Théodore Perron-Kyritsos
Messages : 12
Enregistré le : 04 Juil 2017, 12:41

if colonne n'existe pas, la créer

Messagepar Théodore Perron-Kyritsos » 06 Juil 2017, 12:57

Bonjour,

Je posséde de nombreux tableaux, qui vont posséder entre 2 et 3 colonne et une centaine de lignes chacun. Les tableaux sont remplis de valeurs allant de 0 à des valeurs indéterminées. Mon but étant de remplacer chaque valeur valant NA ou 0 par 0, et chaque valeur supérieure à 1 par 1. J'ai donc crée la fonction suivante dans le but de la rentrer dans une fonction lapply :

Code : Tout sélectionner

f <- function(X){
  X <- replace(X, is.na(X),0)
  X$C1[X$C1>0]<-1
  X$C2[X$C2>0]<-1
  X$C3[X$C3>0]<-1
   X <- return(X)
}


Mon problème étant que comme certains de mes tableaux possédent seulement 2 colonnes (C1 et C2) ma boucle m'envoie le message d'erreur suivant lorsqu'elle rencontre un tableau à 2 colonnes :

Code : Tout sélectionner

Error in `$<-.data.frame`(`*tmp*`, "C3", value = numeric(0)) :
  le tableau de remplacement a 0 lignes, le tableau remplacé en a 98


Ce que je voudrais ce que pour les tableaux à 2 colonnes ma fonction crée une colonne C3 avec pour chaqu'une des 98 lignes la valeur 0. J'ai essayé plusieurs combinaisont avec "if" et "lenght" (et en m'inspirant des termes rencontrés lors des messages d'erreurs) mais je n'y suis pas arrivé..

Merci d'avance pour vos conseils

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: if colonne n'existe pas, la créer

Messagepar Gabriel Terraz » 06 Juil 2017, 13:16

Salut,
Je te propose cette solution :

data bidons :

Code : Tout sélectionner

df <- data.frame(a = sample(c(NA,0:5), 10, rep = T), b= sample(c(NA,0:5), 10, rep = T))
df
    a  b
1  NA  1
2   1 NA
3   2  0
4   2  1
5   0  0
6   5  1
7   5  5
8   1  3
9   3 NA
10  1 NA


La fonction :

Code : Tout sélectionner

f <- function(dataframe){
    dataframe[is.na(dataframe)] <- 0
    dataframe[dataframe > 0] <- 1
    dataframe}


Le résultat :

Code : Tout sélectionner

f(df)
   a b
1  0 1
2  1 0
3  1 0
4  1 1
5  0 0
6  1 1
7  1 1
8  1 1
9  1 0
10 1 0

Théodore Perron-Kyritsos
Messages : 12
Enregistré le : 04 Juil 2017, 12:41

Re: if colonne n'existe pas, la créer

Messagepar Théodore Perron-Kyritsos » 06 Juil 2017, 13:24

Merci cela épure ma fonction et resout le problème du message d'erreur. Mais je souhaite faire en sorte que quand je rentre un tableau qui a seulement 2 colonne en créer 3 (et la remplir de 0).

EDIT : J'ai oublié de préciser j'ai en fait une colonne A remplis de valeur non numériques (en plus des 2 ou 3 colonnes elle remplies de valeurs numériques) et avec cette solution la colonne A se remplie de 1.

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: if colonne n'existe pas, la créer

Messagepar Gabriel Terraz » 06 Juil 2017, 14:18

Bon bah nouvelle version :

Sous l'hypothèse que la colonne A soit la première

Code : Tout sélectionner

f <- function(dataframe){
    df = dataframe[,-1]
    df[is.na(df)] <- 0
    df[df > 0] <- 1
    if(ncol(df == 2)){
        df <- data.frame(df,c =0)
     }
    data.frame(A = dataframe$A,df)
}

Théodore Perron-Kyritsos
Messages : 12
Enregistré le : 04 Juil 2017, 12:41

Re: if colonne n'existe pas, la créer

Messagepar Théodore Perron-Kyritsos » 07 Juil 2017, 13:39

J'ai essayé et ca ne fonctionnait pas (j'avais toujours mes NA et ma colonne C3 ne c'était pas créer pour les tableau ayant seulement A,C1,C2 et non A,C1,C2,C3. Mais j'ai pu en m'inspirant de ta formule (je suis nouveaux sur R et il y a beaucoup de "mots" que je ne connais pas, c'est donc difficile de me debloquer tout seul parfois) atteindre mon objectif :

Code : Tout sélectionner

f <- function(X){
  X <- replace(X, is.na(X),0)
  X$C1[X$C1>0]<-1
  X$C2[X$C2>0]<-1
  if(ncol(X)== 4){
    X$C3[X$C3>0]<-1
  }else{
    d <- data.frame(matrix(0,98,1))
    names(d) <- "C3"
    X <- cbind(X, d)
    }
  X <- return(X)
  }


Merci !

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: if colonne n'existe pas, la créer

Messagepar Gabriel Terraz » 07 Juil 2017, 14:57

Salut,
J'ai repéré une erreur dans ma fonction, une parenthèse mal placée...
Si jamais tu veux la fonction tout de même :

Code : Tout sélectionner

f <- function(dataframe){
    df = dataframe[,-1]
    df[is.na(df)] <- 0
    df[df > 0] <- 1
    if(ncol(df) == 2){## Parenthèse au bon endroit
        df <- data.frame(df,c =0)
     }
    data.frame(A = dataframe$A,df)
}


Au travail :

Code : Tout sélectionner

dput(df1)
df1 <- structure(list(A = structure(1:10, .Label = c("a", "b", "c",
"d", "e", "f", "g", "h", "i", "j"), class = "factor"), C1 = c(1L,
3L, 1L, NA, NA, 0L, 2L, 2L, 2L, 3L), C2 = c(1L, 3L, 3L, 3L, 2L,
1L, 1L, 2L, 0L, NA)), .Names = c("A", "C1", "C2"), row.names = c(NA,
-10L), class = "data.frame")
df1
   A C1 C2
1  a  1  1
2  b  3  3
3  c  1  3
4  d NA  3
5  e NA  2
6  f  0  1
7  g  2  1
8  h  2  2
9  i  2  0
10 j  3 NA



Code : Tout sélectionner

df2 <- structure(list(A = structure(1:10, .Label = c("a", "b", "c",
"d", "e", "f", "g", "h", "i", "j"), class = "factor"), C1 = c(3L,
NA, 2L, 2L, NA, 0L, 1L, 1L, NA, 0L), C2 = c(0L, 0L, 0L, NA, 0L,
1L, 2L, NA, NA, NA), C3 = c(NA, NA, 2L, 1L, 1L, 2L, 2L, NA, NA,
2L)), .Names = c("A", "C1", "C2", "C3"), row.names = c(NA, -10L
), class = "data.frame")
df2
   A C1 C2 C3
1  a  3  0 NA
2  b NA  0 NA
3  c  2  0  2
4  d  2 NA  1
5  e NA  0  1
6  f  0  1  2
7  g  1  2  2
8  h  1 NA NA
9  i NA NA NA
10 j  0 NA  2


Code : Tout sélectionner

f(df1)
   A C1 C2 c
1  a  1  1 0
2  b  1  1 0
3  c  1  1 0
4  d  0  1 0
5  e  0  1 0
6  f  0  1 0
7  g  1  1 0
8  h  1  1 0
9  i  1  0 0
10 j  1  0 0
f(df2)
   A C1 C2 C3
1  a  1  0  0
2  b  0  0  0
3  c  1  0  1
4  d  1  0  1
5  e  0  0  1
6  f  0  1  1
7  g  1  1  1
8  h  1  0  0
9  i  0  0  0
10 j  0  0  1


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité