Précédent   Forum du club des développeurs et IT Pro > Autres langages > Autres langages > R
R Forum d'entraide sur la programmation en langage R
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 13/12/2012, 15h56   #1
B65AcR
Candidat au titre de Membre du Club
 
Homme
touristepationné
Inscription : janvier 2012
Messages : 44
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : touristepationné
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2012
Messages : 44
Points : 14
Points : 14
Par défaut sélection des lignes d'un tableau

Bonjour,

J'aimerai faire apparaitre les lignes d'un tableau dont la valeur dans les colonne "Un", "Deux" ou "Trois" est égale a "i" ou a "iW"

Voici mon tableau:
Code :
1
2
3
4
5
6
Un <- c(3,"3W",10,5,5)
Deux<-c(5,10,5,3,1)
Trois<-c(4,4,4,4,3)
matrice <- matrix(c(Un,Deux,Trois), nrow=5, ncol=3)
# Et des colonnes
colnames(matrice) <- c("Un","Deux", "Trois")
Comment faire?

Merci par avance
B65AcR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2012, 00h07   #2
vchouraki
Membre éclairé
 
Vincent Chouraki
Inscription : juillet 2010
Messages : 137
Détails du profil
Informations personnelles :
Nom : Vincent Chouraki
Localisation : Etats-Unis

Informations forums :
Inscription : juillet 2010
Messages : 137
Points : 363
Points : 363
Bonjour,

Code :
1
2
3
4
5
?which
?grep
?`==`
?`%in%`
?`[`
HTH

Vincent
vchouraki est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/12/2012, 11h12   #3
B65AcR
Candidat au titre de Membre du Club
 
Homme
touristepationné
Inscription : janvier 2012
Messages : 44
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : touristepationné
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2012
Messages : 44
Points : 14
Points : 14
Merci, mais j'ai déjà essayé tout ça et ça suffit pas. La solution est plus complexe qu'il n'y parait au premier regard.

Je n'y arrive vraiment pas, il y a toujours quelque chose qui rate.
B65AcR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2012, 14h02   #4
hoccha
Membre confirmé
 
Homme Olivier Caelen
Inscription : août 2007
Messages : 112
Détails du profil
Informations personnelles :
Nom : Homme Olivier Caelen
Localisation : Belgique

Informations forums :
Inscription : août 2007
Messages : 112
Points : 217
Points : 217
Hello,

Juste pour être bien certain, dans l'exemple que vous donnez:
Code :
1
2
3
4
5
6
7
> matrice
     Un   Deux Trois
[1,] "3"  "5"  "4"  
[2,] "3W" "10" "4"  
[3,] "10" "5"  "4"  
[4,] "5"  "3"  "4"  
[5,] "5"  "1"  "3"
Si i=3 alors la fonction doit donner 1 2 4 5 comme solution... c'est correct ?

Si oui, voici une proposition de solution :
Code :
1
2
i <- 3
which(apply(matrix(as.character(matrice) %in% c(i,paste(i,"W",sep="")) ,ncol=ncol(matrice)),1,sum)>0)
hoccha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2012, 11h12   #5
B65AcR
Candidat au titre de Membre du Club
 
Homme
touristepationné
Inscription : janvier 2012
Messages : 44
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : touristepationné
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2012
Messages : 44
Points : 14
Points : 14
Merci! dans l'exemple votre code marche merveilleusement bien.
J'ai remplacé "matrice" par "matrice[,1:3]" pour choisir les colonnes où chercher (dans le cas d'un tableau plus grand).

Malheureusement, après avoir adapté le code à un fichier csv, R me répond :

Citation:
[1] Chiffre Un Deux Trois
<0 lignes> (ou 'row.names' de longueur nulle)
voici mon code complet:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
num<-c(1:5)
Un <- c(3,"3W",10,5,5)
Deux<-c(5,10,5,3,1)
Trois<-c(4,4,4,4,3)
matrice <- matrix(c(num,Un,Deux,Trois), nrow=5, ncol=4)

# Nom des colonnes
colnames(matrice) <- c("Chiffre","Un","Deux", "Trois")

matrice

#i ou iW dans les colonnes un deux ou trois
matrice[which(apply(matrix(as.character(matrice[,1:3]) %in% c(i,paste(i,"W",sep="")) ,ncol=ncol(matrice[,1:3])),1,sum)>0),]

#enregistre
write.table (matrice, file = "TEST.csv", sep=",",row.names=FALSE, na="")

#efface mémoire
rm(list=ls())
 
#Lecture du fichier ou trouver les informations
echantillon<-read.csv("TEST.csv")
 
echantillon

i<-4
 
echantillon[which(apply(matrix(as.character(echantillon[,2:4]) %in% c(i,paste(i,"W",sep="")) ,ncol=ncol(echantillon[,2:4])),1,sum)>0),]
Je retombe toujours sur ce problème. Pourquoi ?
B65AcR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2012, 22h01   #6
B65AcR
Candidat au titre de Membre du Club
 
Homme
touristepationné
Inscription : janvier 2012
Messages : 44
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : touristepationné
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2012
Messages : 44
Points : 14
Points : 14
J'ai trouvé!
Après ouverture du fichier, je dois le transformer en matrice.

Mais je ne sais absolument pas pourquoi. Quelqu'un aurait le courage de m'expliquer?

Merci par avance.
B65AcR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 01h00   #7
vchouraki
Membre éclairé
 
Vincent Chouraki
Inscription : juillet 2010
Messages : 137
Détails du profil
Informations personnelles :
Nom : Vincent Chouraki
Localisation : Etats-Unis

Informations forums :
Inscription : juillet 2010
Messages : 137
Points : 363
Points : 363
Bonjour,

ligne 25, insérer :
ensuite lire :
paragraphe "Value"

Ce qui devrait vous donner la réponse à votre question.

HTH

Vincent

PS : on peut faire une fonction qui indique le nombre de lignes sans utiliser apply (à compléter et à tester parce que là, il n'y a aucune vérif des arguments, etc et ça ne marche que si mat est une matrice)

Code :
1
2
3
4
5
6
7
test <- function(expr.reg, mat) {
 lignes <- grep(expr.reg, mat) %% nrow(mat)
 lignes[which(lignes == 0)] <- nrow(mat)
 return(unique(sort(lignes)))
}

test("3W?", matrice)
vchouraki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 21h27   #8
B65AcR
Candidat au titre de Membre du Club
 
Homme
touristepationné
Inscription : janvier 2012
Messages : 44
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : touristepationné
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2012
Messages : 44
Points : 14
Points : 14
Citation:
ligne 25, insérer :
Code :
Sélectionner tout - Visualiser dans une fenêtre à part
class(echantillon)
ensuite lire :
Code :
Sélectionner tout - Visualiser dans une fenêtre à part
?read.csv
paragraphe "Value"
Ce qui devrait vous donner la réponse à votre question.
Merci pour ces conseils. Je les ai suivi et constaté qu’après ouverture, read.csv retournait un data frame.
D’après ce que j'ai pu comprendre de l'aide, colClasses permettrait de corriger cela.
J'ai donc entré:
echantillon<-read.csv("TEST.csv",header = TRUE, colClasses = "matrix")

Mais les résultats n'ont pas suivi...
Et je n'ai pas compris pourquoi une matrice est nécessaire, plutôt qu'un data frame...

Désolé

Citation:
on peut faire une fonction qui indique le nombre de lignes sans utiliser apply
L'idée est très bonne, mais je n'ai pas le niveau pour me rendre compte de l'intérêt. apply est moins valable qu'une fonction?
B65AcR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 23h05   #9
vchouraki
Membre éclairé
 
Vincent Chouraki
Inscription : juillet 2010
Messages : 137
Détails du profil
Informations personnelles :
Nom : Vincent Chouraki
Localisation : Etats-Unis

Informations forums :
Inscription : juillet 2010
Messages : 137
Points : 363
Points : 363
Bonjour,

Non la fonction était juste une suggestion. C'est vous qui voyez.

colClasses est un argument qui permet de préciser le type de chaque colonne du data.frame, pas de changer le data.frame en lui même. Il faut donc utiliser as.matrix par exemple si vous voulez reconvertir le data.frame en matrice.

Votre exemple part d'une matrice mais vous pourriez très bien utiliser un data.frame. C'est à vous de voir quel type d'objet est le mieux adapté à votre problème et à vos données.

HTH

Vincent
vchouraki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 10h28   #10
B65AcR
Candidat au titre de Membre du Club
 
Homme
touristepationné
Inscription : janvier 2012
Messages : 44
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : touristepationné
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2012
Messages : 44
Points : 14
Points : 14
Cette fois j'ai compris, merci!
B65AcR est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h13.


 
 
 
 
Partenaires

Hébergement Web