Fusion de plusieurs colonnes d'une data frame

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

Morgane Labadie
Messages : 12
Enregistré le : 11 Oct 2016, 20:32

Fusion de plusieurs colonnes d'une data frame

Messagepar Morgane Labadie » 18 Oct 2016, 15:58

Bonjour a tous,

Je vous écrit afin de vous demander votre avis car je suis bloqué et je n'arrive pas à trouver la solution à mon problème.

Tout d'abord, voici un petit aperçu de ma base de donnée :

Image

J'ai importé la base de donnée à l'aide de la commande suivante :
Enclosurefrog <- read.table(file="~/Documents/RStudio/Script Donnee Maitrise/Fusion Enclosure Terrestrial Wood frog 2016.txt", header=TRUE,sep= "\t", colClasses = "factor")
str(Enclosurefrog)
Voici le résultat de l'output :
> str(Enclosurefrog)
'data.frame': 276 obs. of 31 variables:
$ ID.tadpole: Factor w/ 276 levels "`V46","INCONNU ",..: 6 19 32 33 34 54 11 12 51 52 ...
$ E1S1 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ E1S2 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ E1S3 : Factor w/ 2 levels "0","1": 1 1 2 2 1 1 1 1 1 1 ...
$ E1S4 : Factor w/ 2 levels "0","1": 1 1 2 1 1 1 2 1 1 1 ...
$ E1S5 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ E1S6 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ E1S7 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ E1S8 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ E1S9 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ E1S10 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ E1S11 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ E1S12 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ S1S13 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...

Mon but est de fusionner plusieurs colonnes ensembles pour chaque ID.tadpole.

J'ai donc transformé dans un premier temps les données E1S1 à E1S30 en valeur numériques à l'aide la commande suivante :
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S1)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S2)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S3)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S4)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S5)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S6)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S7)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S8)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S9)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S10)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S11)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S12)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S13)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S14)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S15)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S16)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S17)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S18)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S19)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S20)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S21)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S22)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S23)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S24)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S25)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S26)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S27)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S28)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S29)
Enclosurefrog1 <- as.numeric(Enclosurefrog$E1S30)

Puis j'ai utilisé la fonction suivante :

Enclosurefrog2 <- apply(Enclosurefrog1[,2:7], MARGIN = 1, FUN = function (i) ifelse(sum (i) > 0, 1, 0))

A utiliser plus tard quand la première marchera
apply(Enclosurefrog1[, 8:13], MARGIN = 1, FUN = function (i) ifelse(sum (i) > 0, 1, 0))

apply(Enclosurefrog1[, 14:19], MARGIN = 1, FUN = function (i) ifelse(sum (i) > 0, 1, 0))

apply(Enclosurefrog1[, 20:25], MARGIN = 1, FUN = function (i) ifelse(sum (i) > 0, 1, 0))

apply(Enclosurefrog1[, 26:31], MARGIN = 1, FUN = function (i) ifelse(sum (i) > 0, 1, 0))

En effet, quand je fais rouler la première ligne de mon code il me met un message d'erreur suivant :
Error in Enclosurefrog1[, 2:7] : nombre de dimensions incorrect

Avez vous une solution ?

Merci d'avance pour vos réponses

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Re: Fusion de plusieurs colonnes d'une data frame

Messagepar Eric Casellas » 18 Oct 2016, 16:12

Bonjour,

dans le code que tu montre a chaque appel de as.numeric(...) tu ecrase à chaque fois Enclosurefrog1 (qui est un vecteur et pas un data.frame..)
Si tu veux te faire un nouveau data.frame Enclosurefrog1 qui est la copie de Enclosurefrog avec les colonnes converties en numeric tu peut faire quelque chose comme :

Code : Tout sélectionner

Enclosurefrog1=Enclosurefrog
for (i in names(Enclosurefrog1)) {
   Enclosurefrog1[,i] <- as.numeric(Enclosurefrog1[,i])
}

#idem via sapply
Enclosurefrog1 <- sapply(names(Enclosurefrog), function(x){ as.numeric(Enclosurefrog[,x])})
Eric

Morgane Labadie
Messages : 12
Enregistré le : 11 Oct 2016, 20:32

Re: Fusion de plusieurs colonnes d'une data frame

Messagepar Morgane Labadie » 18 Oct 2016, 16:17

Merci pour ta réponse Eric.

Par contre si j'utilise ce code, j'ai un problème avec ma première colonne ID.tadpole qui doit rester en facteur.

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Re: Fusion de plusieurs colonnes d'une data frame

Messagepar Eric Casellas » 19 Oct 2016, 08:13

Morgane Labadie a écrit :Merci pour ta réponse Eric.

Par contre si j'utilise ce code, j'ai un problème avec ma première colonne ID.tadpole qui doit rester en facteur.

Tu peut remplacer names(Enclosurefrog) par names(Enclosurefrog)[-1] pour en enlever le 1er element
Eric

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Fusion de plusieurs colonnes d'une data frame

Messagepar Logez Maxime » 19 Oct 2016, 12:11

Bonjour,

dans ce cas on peut utiliser le fait qu'un data.frame est une classe particulière de liste et se faciliter les choses avec un lapply :

Code : Tout sélectionner

Enclosurefrog[-1] <- lapply(Enclosurefrog[-1], as.numeric)
 
Ensuite il est plus efficace de vectoriser ton calcul sur les lignes de ton tableau, notamment d'utiliser des fonctions comme rowSums qui sont beaucoup plus efficace que apply(Enclosurefrog..., 1, sum) et d'utiliser des conditions sur la totalité des résultats que ligne à ligne :

Code : Tout sélectionner

tab <- as.data.frame(matrix(rbinom(20, 1, 0.33), 5))
Enclosurefrog2 <- (rowSums(tab)>0)*1
# equivalent à
apply(tab, 1, function(x) ifelse(sum(x)>0, 1, 0))

Cordialement,
Maxime

Morgane Labadie
Messages : 12
Enregistré le : 11 Oct 2016, 20:32

Re: Fusion de plusieurs colonnes d'une data frame

Messagepar Morgane Labadie » 19 Oct 2016, 15:06

Merci Eric et Logez pour vos réponses.

Cependant, dans les deux cas, quelque soit la ligne de code que j'utilise pour transformer des données en données numériques. Il s'avère que mes 0 deviennent des 1 et que mes 1 deviennent des 2 !!

Du coup, cela change complètement mes données

Voici un exemple de ce que j'obtiens :

> Enclosurefrog[-1] <- lapply(Enclosurefrog[-1], as.numeric)
> Enclosurefrog[-1]
E1S1 E1S2 E1S3 E1S4 E1S5 E1S6 E1S7 E1S8 E1S9 E1S10 E1S11 E1S12 S1S13 E1S14 S1S15 E1S16 E1S17
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
3 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1
4 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1
5 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
7 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1
8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
9 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
11 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
13 1 1 1 1 1 1 1 1 1

Avez vous une explication ?

Merci d'avance pour vos réponses

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Re: Fusion de plusieurs colonnes d'une data frame

Messagepar Eric Casellas » 19 Oct 2016, 15:38

Morgane Labadie a écrit :Cependant, dans les deux cas, quelque soit la ligne de code que j'utilise pour transformer des données en données numériques. Il s'avère que mes 0 deviennent des 1 et que mes 1 deviennent des 2 !!


Oui c'est un soucis classique de conversion d'un facteur en numeric, il faut passer par des chaînes de caractères..

Code : Tout sélectionner

X <- data.frame(sample(c("2", "7")))
as.numeric(X[,1])
as.numeric(as.character(X[,1]))
Eric

Morgane Labadie
Messages : 12
Enregistré le : 11 Oct 2016, 20:32

Re: Fusion de plusieurs colonnes d'une data frame

Messagepar Morgane Labadie » 19 Oct 2016, 19:51

Merci


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité