Retirer ligne et colonne sous condition

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

Estelle Vandenabeele
Messages : 5
Enregistré le : 04 Jan 2018, 12:53

Retirer ligne et colonne sous condition

Messagepar Estelle Vandenabeele » 11 Jan 2018, 20:37

Bonjour,
Pour un devoir sous R je souhaiterais écrire dans mon script deux commandes :
- la première retire toutes les colonnes ne contenant que des 0
- la seconde retire toutes les lignes ne contenant que des 0

J'avais écrit ceci mais ça ne fonctionne pas bien :
#Création D'un objet comprenant le cumul de toute les unites d'echantillonnage
cum<-apply(tab,2,sum) # 2 designe les colonnes.
cum #cumul des colonnes du tableau = total par espèce
f0<-sum(cum==0) #f0 représente le nombre d'espèces pour lesquelles aucun individu n'a été relevé durant tous les échantillonnages.
#Supprimer les colonnes avec que des 0
for(i in 1:ncol (tab)){
if(cum==0){ #si le nombre d'espèce où aucun individu n'a été trouvé n'est pas nul
tab<-tab[,-i] #alors je veux enlever dans mon tableau les colonnes (espèces) où le recensement total = 0
}else
{tab<-tab[,] #sinon je n'enlève rien
}
}
#Pour visualiser le nouveau nombre de colonnes
nbcolonnes<-ncol(tab)
nbcolonnes


Et pour les lignes :




#Supprimer les lignes avec que des 0 (NE FONCTIONNE PAS apres cum)
cum2<-apply(tab,1,sum)#1 désigne les lignes
cum2
for(l in 1:nrow (tab)){
if(cum2==0){ #si le nombre de relevés pour lesquels aucun individu n'a été référencé n'est pas nul.
tab<-tab[-l,] #alors je veux enlever dans mon tableau les lignes (relevés) où le recensement total (toutes les espèces) du relevé = 0
}else
{tab<-tab[,] #sinon je n'enlève rien
}
}


#Visualiser le nouveau nombre de lignes
nblignes<-nrow(tab)
nblignes



Avez vous des solutions svp ?

Merci d'avance !

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Retirer ligne et colonne sous condition

Messagepar Pierre-Yves Berrard » 11 Jan 2018, 21:13

Bonjour,

Ce ne serait pas vous rendre service de faire votre devoir à votre place alors je me contente de vous donner une solution partielle.

Essayez d'exécuter le code suivant et de voir à quoi il peut vous servir :

Code : Tout sélectionner

colSums(tab) != 0
rowSums(tab) != 0
PS : rowSums(tab) et colSums(tab) sont des versions plus légères de apply(tab, 1, sum) et apply(tab, 2, sum).

Autre indice : l'ensemble du programme tient en deux lignes de code.
PY

Estelle Vandenabeele
Messages : 5
Enregistré le : 04 Jan 2018, 12:53

Re: Retirer ligne et colonne sous condition

Messagepar Estelle Vandenabeele » 12 Jan 2018, 16:23

Ca ne serait pas le faire à ma place au vue de tout le reste du script déjà fait mais merci.
Une boucle for permettrait d'éliminer les lignes/colonnes FALSE ensuite ? Mais ca risque de dépasser les deux lignes..

J'avais pensé à quelque chose comme ça mais ça ne fonctionne pas :

colSums(tab) != 0
for(i in 1:ncol (tab)){
tab[tab[,i]!=0,]

Mais cela ne semble rien supprimer

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Retirer ligne et colonne sous condition

Messagepar Pierre-Yves Berrard » 12 Jan 2018, 16:39

Bien souvent, les boucles dans R ne sont pas obligatoires.

En complément de mon message précédent, je vous donne un autre indice par cet exemple fictif :

Code : Tout sélectionner

tab <- data.frame(V1 = c(0,0,1), V2 = c(0,1,0), V3 = c(0,0,0))
tab[ , c(TRUE, TRUE, FALSE)]
PY

jean lobry
Messages : 733
Enregistré le : 17 Jan 2008, 20:00
Contact :

Re: Retirer ligne et colonne sous condition

Messagepar jean lobry » 12 Jan 2018, 19:37

Pierre-Yves Berrard a écrit :Autre indice : l'ensemble du programme tient en deux lignes de code.

Je vous parie que le contributeur, vexé, vous la fait en une seule ligne de code.

My 2 bitcoins

jean lobry

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Retirer ligne et colonne sous condition

Messagepar Pierre-Yves Berrard » 12 Jan 2018, 19:39

C'est le but. ;-)

edit : solution (si aucun nombre négatif dans le tableau)

Code : Tout sélectionner

tab[rowSums(tab) != 0, ]
tab[ , colSums(tab) != 0]
PY


Retourner vers « Questions en cours »

Qui est en ligne

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