[résolu] extraire un "sous 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

Stéphane Laurent
Messages : 1551
Enregistré le : 05 Déc 2006, 19:07

[résolu] extraire un "sous data frame"

Messagepar Stéphane Laurent » 29 Mai 2007, 17:51

Bonjour,

Soit le data frame suivant :

Code : Tout sélectionner

> col1 <- c(1,1,2,2)
> col2 <- c("ab", "cd", "ef", "gh")
> col3 <- c(9, 8, 7, 6)
> data <- data.frame(col1=col1, col2=col2, col3=col3)
> data
  col1 col2 col3
1    1   ab    9
2    1   cd    8
3    2   ef    7
4    2   gh    6


Comment extraire rapidement le sous data frame formé des lignes qui ont un 1 dans col1?

Ceci fonctionne mais est laborieux :

Code : Tout sélectionner

> data2 <- data.frame(col1=col1[col1==1], col2=col2[col1==1],
     col3=col3[col1==1])
> data2
  col1 col2 col3
1    1   ab    9
2    1   cd    8


Enfin c'est un mauvais exemple car ici il suffit d'extraire les 2 premières lignes, mais si les 1 étaient "dispersés" sur la 1ère colonne ? Bref comment extraire avec la condition [col1==1] ?

Merci pour votre aide.

SL


PS : J'ai essayé ceci et je ne comprends pas les résultats de ces commandes :


Code : Tout sélectionner

> data3 <- data[col1==1]
> data3
  col1 col2
1    1   ab
2    1   cd
3    2   ef
4    2   gh
> data4 <- data.frame(data)[col1==1]
> data4
  col1 col2
1    1   ab
2    1   cd
3    2   ef
4    2   gh

Aurélien Madouasse
Messages : 352
Enregistré le : 26 Fév 2007, 11:23

Messagepar Aurélien Madouasse » 29 Mai 2007, 18:15

Bonjour,

Je pense que la fonction subset pourrait t'aider:

Code : Tout sélectionner

subs1<-subset(data,col1==1)

subs1

  col1 col2 col3
1    1   ab    9
2    1   cd    8



Tu peux ne sélectionner que certaines colonnes avec l'argument select (voir ?subset).

En espérant avoir répondu à ta question


Aurélien

Stéphane Laurent
Messages : 1551
Enregistré le : 05 Déc 2006, 19:07

Messagepar Stéphane Laurent » 29 Mai 2007, 19:31

Ca me semble parfait, merci bien.

Stéphane.

François Bonnot
Messages : 484
Enregistré le : 10 Nov 2004, 15:19
Contact :

Messagepar François Bonnot » 30 Mai 2007, 06:57

J'ai essayé ceci et je ne comprends pas les résultats de ces commandes :

Code : Tout sélectionner

> data3 <- data[col1==1]
> data3
  col1 col2
1    1   ab
2    1   cd
3    2   ef
4    2   gh

C'est très logique. Un data.frame est un cas particulier de "list" dont les éléments sont les colonnes. Donc tout index simple (à une seule dimension) porte sur les éméments de la liste, donc sur les COLONNES.

Code : Tout sélectionner

> data
  col1 col2 col3
1    1   ab    9
2    1   cd    8
3    2   ef    7
4    2   gh    6
> data[2]
  col2
1   ab
2   cd
3   ef
4   gh

Pour travailler aussi sur les lignes il faut utiliser les 2 dimensions:

Code : Tout sélectionner

> data[2,]
  col1 col2 col3
2    1   cd    8

Donc:

Code : Tout sélectionner

> data[col1==1,]
  col1 col2 col3
1    1   ab    9
2    1   cd    8

Tout cela fait partie de la syntaxe élémentaire de R qu'il faut absolument connaître et qui figure dans tous les documents introductifs. On gagne beaucoup de temps en prenant quelques heures pour lire complètement (et comprendre) au moins un de ces documents.


Retourner vers « Questions en cours »

Qui est en ligne

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