2014-07-20 3 views
-2

J'ai une trame de données avec 3 colonnes de données que je voudrais tracer séparément - 3 parcelles. Les données ont NA (à différents endroits dans les 3 colonnes). Je veux fondamentalement interpoler les valeurs manquantes et tracer ce segment de la ligne (plusieurs sections) en rouge et le reste de la ligne en noir.R - Si autre instruction à l'intérieur de la boucle

J'ai réussi à utiliser 'zoo' pour créer les données interpolées mais je ne sais pas comment tracer une couleur différente pour ce point de données. J'ai trouvé le Elegant way to select the color for a particular segment of a line plot? mais pensais que je pourrais employer une boucle for avec l'instruction if else pour créer la colonne de couleur comme conseillé dans le lien - j'aurais besoin de 3 colonnes de couleurs séparées car j'ai 3 jeux de données.

Appréciez toute aide - ne peut pas vraiment donner un exemple car je ne sais pas par où commencer! Merci

+2

Je vous suggère de préparer un petit exemple reproductible. Voici quelques conseils sur la façon de procéder. http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

+0

Il est presque toujours le cas les personnes venant à R du SAS ou SPSS travail incorrectement atteindre un 'pour() {if() {} else {}} 'quand ils devraient d'abord regarder'? ifelse'. –

+0

Merci BondedDust - Je l'ai fait beaucoup trop compliqué je suis d'accord. C'est le code que j'ai utilisé pour cela si quelqu'un est intéressé UN.GRACE $ Col <- ifelse (is.na (UN.GRACE [2: 4]), "rouge", "noir") –

Répondre

1

Ceci est ma solution. Il suppose que les NA sont toujours présents dans les données d'origine. Ceux-ci seront omis dans la première commande plot(). La fonction ne boucle alors que sur les NA s.

Vous obtiendrez probablement un contrôle plus précis si vous prenez la commande plot() hors de la fonction. Comme écrit, "..." est passé à plot() et un graphique type = "b" est imité - mais il est trivial de le changer à ce que vous voulez.

# Function to plot interpolated valules in specified colours. 
PlotIntrps <- function(exxes, wyes, int_wyes, int_pt = "red", int_ln = "grey", 
     goodcol = "darkgreen", ptch = 20, ...) { 

    plot(exxes, wyes, type = "b", col = goodcol, pch = ptch, ...) 

    nas <- which(is.na(wyes)) 
    enn <- length(wyes) 

    for (idx in seq(nas)) { 
    points(exxes[nas[idx]], int_wyes[idx], col = int_pt, pch = ptch) 
    lines(
     x = c(exxes[max(nas[idx] - 1, 1)], exxes[nas[idx]], 
     exxes[min(nas[idx] + 1, enn)]), 
     y = c(wyes[max(nas[idx] - 1, 1)], int_wyes[idx], 
     wyes[min(nas[idx] + 1, enn)]), 
     col = int_ln, type = "c") 

    # Only needed if you have 2 (or more) contiguous NAs (interpolations) 
    wyes[nas[idx]] <- int_wyes[idx] 
    } 
} 

# Dummy data (jitter() for some noise) 
x_data <- 1:12 
y_data <- jitter(c(12, 11, NA, 9:7, NA, NA, 4:1), factor = 3) 
interpolations <- c(10, 6, 5) 

PlotIntrps(exxes = x_data, wyes = y_data, int_wyes = interpolations, 
    main = "Interpolations in pretty colours!", 
    ylab = "Didn't manage to get all of these") 

Cheers.

+0

Merci - fonctionne super! –

Questions connexes