web-dev-qa-db-fra.com

Extraire un sous-ensemble d'une trame de données en fonction d'une condition impliquant un champ

J'ai un grand fichier CSV avec les résultats d'une enquête médicale réalisée à différents endroits (l'emplacement est un facteur présent dans les données). Certaines analyses étant spécifiques à un emplacement et par souci de commodité, j'aimerais extraire les sous-trames avec les lignes uniquement à partir de ces emplacements. Il se trouve que l'emplacement est le tout premier champ, alors oui, je pourrais le faire en triant les lignes CSV, mais j'aimerais apprendre à le faire en R, car je suis sûr que j'en aurai besoin pour les autres colonnes.

En bref, la question est la suivante: à partir d’un bloc de données foo, comment puis-je créer une autre barre de blocs de données ne contenant que les lignes de foo où foo$location = 'there'?

55

Voici les deux approches principales. Je préfère celui-ci pour sa lisibilité:

bar <- subset(foo, location == "there")

Notez que vous pouvez enchaîner de nombreuses conditions avec & et | pour créer des sous-ensembles complexes.

La seconde est l’approche d’indexation. Vous pouvez indexer des lignes dans R avec des tranches numériques ou booléennes. foo$location == "there" renvoie un vecteur de T et F de même longueur que les lignes de foo. Vous pouvez faire cela pour renvoyer uniquement les lignes où la condition renvoie true.

foo[foo$location == "there", ]
93
JoFrhwld

Juste pour étendre la réponse ci-dessus, vous pouvez également indexer vos colonnes plutôt que de spécifier les noms des colonnes, ce qui peut également être utile selon ce que vous faites. Étant donné que votre emplacement est le premier champ, cela ressemblerait à ceci:

    bar <- foo[foo[ ,1] == "there", ]

Cela est utile car vous pouvez effectuer des opérations sur la valeur de votre colonne, comme une boucle sur des colonnes spécifiques (et vous pouvez également procéder de la même manière en indexant les numéros de ligne).

Ceci est également utile si vous devez effectuer une opération sur plusieurs colonnes car vous pouvez ensuite spécifier une plage de colonnes:

    foo[foo[ ,c(1:N)], ]

Ou des colonnes spécifiques, comme on peut s'y attendre.

    foo[foo[ ,c(1,5,9)], ]
1
DryLabRebel