2010-02-24 12 views
3

J'ai un data.frame appelé series_to_plot.df que j'ai créé en combinant un certain nombre d'autres data.de noms ensemble (voir ci-dessous). Je veux maintenant sortir juste la colonne .mm de chacun d'eux, ainsi je peux les tracer. Donc je veux sortir la 3ème colonne de chaque data.frame (par exemple p3c3.mm, p3c4.mm etc ...), mais je ne vois pas comment faire cela pour tous les data.frames de l'objet sans boucler le nom. Est-ce possible?Comment référencer des colonnes d'un data.frame dans un data.frame?

Je ne peux retirer qu'un seul ensemble: par ex. series_to_plot.df [[3]] et un autre par series_to_plot.df [[10]] (donc c'est juste une liste de vecteurs ..) et je peux référencer directement avec series_to_plot.df $ p3c3.mm, mais y a t-il un commande pour obtenir un vecteur contenant tous les mm de chaque data.frame? Je me attendais quelque chose comme un index cela fonctionne: series_to_plot.df [3 [3]], mais elle renvoie l'erreur dans [.data.frame (series_to_plot.df, 3 [3]): colonnes non définies sélectionnées

series_to_plot.df 
      p3c3.rd   p3c3.day p3c3.mm  p3c3.sd     p3c3.n p3c3.noo p3c3.no_NAs 
    1  2010-01-04    0 0.1702531 0.04003364    7    1   0 
    2  2010-01-06    2 0.1790594 0.04696674    7    1   0 
    3  2010-01-09    5 0.1720404 0.03801756    8    0   0 

      p3c4.rd   p3c4.day p3c4.mm  p3c4.sd     p3c4.n p3c4.noo p3c4.no_NAs 
    1  2010-01-04    0 0.1076581 0.006542157    6    2   0 
    2  2010-01-06    2 0.1393447 0.066758781    7    1   0 
    3  2010-01-09    5 0.2056846 0.047722862    7    1   0 

      p3c5.rd   p3c5.day p3c5.mm  p3c5.sd     p3c5.n p3c5.noo p3c5.no_NAs 
    1  2010-01-04    0 0.07987147 0.006508766    7    1   0 
    2  2010-01-06    2 0.11496167 0.046478767    8    0   0 
    3  2010-01-09    5 0.40326471 0.210217097    7    1   0 
+0

Etes-vous sûr que series_to_plot.df est une trame de données? En lisant votre commentaire et en regardant la sortie, je me demande s'il s'agit d'une liste ou d'un vecteur contenant un certain nombre de trames de données. Je ne sais pas pourquoi votre sortie affiche les en-têtes de colonne toutes les 3 lignes et les numéros de ligne recommencent. Pour tester la structure exécutez str (series_to_plot.df) –

+0

Merci, oui c'était un data.frame, c'était un ensemble de data.frames dans un autre data.frame. Mais vous avez raison, ce n'est pas la meilleure structure de données, j'ai trouvé quelques conseils pour la meilleure structure ici: http: // stackoverflow.com/questions/1181060/rehaping-time-series-data-from-large-to-tall-format-for-traçage – John

Répondre

2

pour ajouter aux autres réponses, je ne pense pas que ce soit une bonne idée d'avoir des informations utiles codées dans les noms de variables. Il est préférable de réorganiser vos données afin que toutes les informations utiles soient dans la valeur de certaines variables. Je ne sais pas assez sur votre ensemble de données pour suggérer le format, mais il pourrait être quelque chose comme

p c   rd day date mm sd ... 
3 3 2010-10-04 ... 

Une fois que vous avez fait cela la réponse à votre question devient le df$mm simple. Si vous obtenez les données sous une forme moins utile à partir d'une source externe, vous pouvez les réorganiser sous une forme plus utile comme ci-dessus dans R en utilisant la fonction reshape ou les fonctions du paquet reshape.

+0

J'ai essayé de le suggérer dans ma réponse aussi, mais j'ai supposé que 'pxcy' est un nom d'un data.frame partiel (ce truc de rbind/cbind). Mais votre conseil pour inclure des parties de noms en tant que nouvelles colonnes est très agréable. – Marek

+0

Merci, je vais essayer de fondre et remodeler ... (voir aussi http://stackoverflow.com/questions/1181060/reshaping-time-series-data-from-wide-to-tall-format-for-plotting) – John

4

Pour obtenir toutes les colonnes avec le nom spécifié, vous pouvez faire:

names_with_mm <- grep("mm$", names(series_to_plot.df), value=TRUE) 
series_to_plot.df[, names_with_mm] 

Mais si votre base data.frame « s ont tous la même structure, vous pouvez les rbind, quelque chose comme:

series_to_plot.df <- rbind(
    cbind(name="p3c3", p3c3), 
    cbind(name="p3c4", p3c4), 
    cbind(name="p3c5", p3c5) 
) 

Ensuite, les valeurs mm sont dans une colonne et il est plus facile à tracer.

1

Le R Language Definition a quelques bonnes informations sur l'indexation (voir 3.4.1), ce qui est très utile.

Vous pouvez ensuite extraire les noms correspondant à une séquence à l'aide de la commande grep(). Ensuite chaîne tous ensemble comme ceci:

dataWithMM <- series_to_plot.df[,grep("[P]", names(series_to_plot.df))] 

de déconstruire un peu, cela devient le nombre des colonnes qui correspondent au modèle « mm »:

namesThatMatch <- grep("[mm]", names(series_to_plot.df) 

Ensuite, nous utilisons cette liste pour appeler les colonnes que nous voulons:

dataWithMM <- series_to_plot.df[, namesThatMatch ] 
+0

La réponse de Marek est mieux regex que la mienne. "[mm]" correspondra à n'importe quelle colonne avec "mm" dedans n'importe où. "mm $" correspondra seulement aux colonnes qui se terminent par "mm", ce qui peut être un meilleur ajustement. –

Questions connexes