2017-01-20 4 views
0

Ich versuche, eine "day_cent" Variable zu erstellen, wobei der Tag um den maximalen tn für jede ID zentriert ist. Ich habe den folgenden Code geschrieben, aber "day_centn" hat eine große Anzahl von scheinbar zufälligen NAs, und ich verstehe nicht, wie man die Lücken füllt.fehlende Werte in muate

df <- df %>% group_by(id) %>% 
mutate(day_centtn = day - day[tn == max]) 

Mein Ziel wäre dann tn vs day_centtn plotten, aber im Moment das bringt ein leeres Gitter

p <- ggplot(df, aes(x=day_centtn, y=tn_frac, group=id)) 
p + geom_line(aes(colour=id)) + geom_point() + 
xlim(-5,5) + geom_vline(xintercept = 0) + ylim(0,100)) 

id day tn max day_centtn tn_frac 
1 0 NA 32 NA NA 
1 1 32 32 0 100 
1 2 27 32 NA 84.375 
1 3 13 32 NA 40.625 
1 4 NA 32 NA NA 
1 5 9 32 NA 28.125 
1 6 NA 32 NA NA 
1 7 9 32 NA 28.125 
1 8 NA 32 NA NA 
1 9 NA 32 8 NA 
1 10 NA 32 NA NA 
1 180 NA 32 NA NA 
2 0 NA 9 NA NA 
2 1 NA 9 NA NA 
2 2 NA 9 NA NA 
2 3 8 9 NA 88.8888889 
2 4 6 9 -5 66.6666667 
2 5 7 9 NA 77.7777778 
2 6 7 9 NA 77.7777778 
2 7 7 9 NA 77.7777778 
2 8 NA 9 NA NA 
2 9 9 9 NA 100 
2 10 7 9 1 77.7777778 
3 0 14 1935-2 0.7235142 
3 1 11671935NA 60.3100775 
3 2 193519350 100 
3 3 10391935NA 53.6950904 
3 4 308 19352 15.9173127 
3 5 112 1935NA 5.7881137 
3 6 103 19354 5.3229974 
3 7 76 1935NA 3.9276486 
3 8 65 19356 3.3591731 
3 9 48 1935NA 2.4806202 
3 10 27 19358 1.3953488 

Vielen Dank, Annemarie bis

+0

Bitte lesen Sie die Informationen darüber, wie Sie ein [reproduzierbares Beispiel] (http://stackoverflow.com/questions/5963269) geben können. Dies wird es anderen sehr erleichtern, Ihnen zu helfen. – Axeman

+0

@Axeman Ich habe das hoffentlich verbessert, danke für den Link. – Annemarie

Antwort

1

Ich würde zuerst eine Spalte hinzufügen, wo Sie bewerten, ob tn gleich max ist. In dieser Bewertungsfunktion könnten Sie sich um die NA-Werte in tn kümmern. Dies ist wichtig, da der Vergleich eines Wertes mit NA NA zurückgibt (NA == 32 gibt NA zurück).

Etwas wie:

df %>% 
mutate(is_max = ifelse(! is.na(tn), tn == max, FALSE) %>% 
group_by(id) %>% 
mutate(day_centtn = day - day[is_max]) 

Allerdings wird es ein Fehler in diesem Code, wenn es mehr als ein tn Wert gleich den max in den Gruppen-ID ist. In diesem Fall könnte das funktionieren (obwohl ich es nicht getestet habe).

mutate(day_centtn = day - day[is_max][1]) 
+0

Danke. Ich denke, es sind die fehlenden Werte in Troponin, das ist das Problem, nicht wahr (es lief gut, wenn ich nur Rekord 3 verwendet habe). Ich kann Ihren Code nicht zum Funktionieren bringen - er klagt darüber, dass Error in eval (substitute (expr), envir, enclos): keine anwendbare Methode für 'group_by_' auf ein Objekt der Klasse 'logical' angewendet wurde – Annemarie

+0

Ich habe es getan ! Ich habe Tag = Max Tag verwendet, anstatt Tn = Max Tn, und es hat funktioniert. Vielen Dank – Annemarie