2010-08-13 7 views
0

J'ai une trame de données avec une variable quantitative, x, et plusieurs facteurs différents, f1, f2, ..., fn. Le nombre de niveaux n'est pas constant entre les facteurs. Je souhaite créer un (seul) diagramme de densité de x par niveau de facteur fi.comment scripter en R sur les niveaux d'un facteur

Je sais comment coder manuellement ceci pour un facteur spécifique. Par exemple, voici l'intrigue pour un facteur à deux niveaux.

# set up the background plot 
plot(density(frame$x[frame$f1=="level1"])) 

# add curves 
lines(density(frame$x[frame$f1=="level2"])) 

Je pourrais aussi le faire comme ceci:

# set up the background plot 
plot(NA) 

# add curves 
lines(density(frame$x[frame$f1=="level1"])) 
lines(density(frame$x[frame$f1=="level2"])) 

Ce que je voudrais savoir comment puis-je faire si je ne donnez que le facteur comme entrée. Je ne sais même pas comment écrire une boucle for qui ferait ce dont j'ai besoin, et j'ai le sentiment que le 'R' éviterait les boucles. Bonus: Pour les graphiques, je voudrais spécifier des valeurs limites pour les axes. En ce moment, je le fais de cette façon:

xmin=min(frame$x[frame$f1=="level1"],frame$x[frame$f1=="level2"]) 

Comment puis-je inclure ce type de calcul dans mon script?

Répondre

3

Je suppose que vos données sont au format (trame de données appelé df)

f1  f2  f3  fn  value 
    A........................... value 1 
    A............................value 2 
    ............................. 
    B............................value n-1 
    B............................value n 

Dans cette cause, treillis (ou ggplot2) sera très utile.

library(lattice) 

densityplot(~value, groups = f1, data = df, plot.points = FALSE) 

Cela devrait vous rapprocher de ce que vous cherchez, je pense.

Greg

+0

fonctionne très bien! Merci beaucoup! –

+0

vous pouvez ajouter auto.key = TRUE en tant qu'argument à densityplot. – Greg

+0

Merci pour cela aussi. Bon pointeur! –

1

Vous pouvez également faire:

# create an empty plot. You may want to add xlab, ylab etc 
# EDIT: also add some appropriate axis limits with xlim and ylim 
plot(0, 0, "n", xlim=c(0, 10), ylim=c(0, 2)) 
levels <- unique(frame$f1) 
for (l in levels) 
    { 
    lines(density(frame$x[frame$f1==l])) 
    } 
+0

Merci, nico! Fonctionne très bien. Et j'apprécie de voir comment utiliser une boucle for de cette manière. –

1

ggplot2 Code

library(ggplot2) 
ggplot(data, aes(value, colour = f1)) + 
    stat_density(position = "identity") 
+0

Merci, JoFrhwld. J'ai entendu parler de ggplot2 et j'ai eu l'intention d'en apprendre plus à ce sujet. J'aime la façon dont les commandes marquent aussi les intrigues. –

Questions connexes