2016-05-06 18 views
0

Ich habe einen Datensatz mit wiederholten Messungen im Laufe der Zeit, in denen ich Prädiktoren für den maximalen tn-Wert suchen. Ich bin nicht an Maßnahmen interessiert, die danach auftreten. Die maximalen Werte treten an verschiedenen Tagen für verschiedene Patienten auf.Abschneiden Datensatz nach Maximalwert

ID day tn hb sofa 
1 1 7 85 NA 
1 2 NA NA NA 
1 3 35 80 13 
1 4 28 79 12 
2 1 500 NA 12 
2 2 280 80 9 
2 3 140 90 8 
2 4 20 90 7 
3 1 60 80 12 
3 2 75 75 10 
3 3 NA 75 NA 
3 4 55 84 7 

I tn_ max finden:

tn_max <- df %>% group_by(record) %>% summarise(tn_max = max(tn,na.rm=TRUE)) 

Wie kann ich den Datensatz nach dem Maximum tn für jeden Patienten gestutzt? fand ich diesen Code aus einer früheren ähnlichen Frage, aber ich kann es nicht Fehler an der Arbeit: unerwartete ':' in "N_max = find (df ("

mod_df = df; 
    N_max = find(df(:,3) == max(df(:,3))); 
    N_max(1); 

    for N=1:size(df,3) 
    if df(N,1) < N_max 
    mod_df (N,:)=0; 
    end 
    end 
    mod_data_1(all(mod_data_1==0,1),:) = [] 

Vielen Dank, Annemarie

+2

ich denke, der Code, den Sie ist in Matlab gefunden ... –

Antwort

0

Zuerst möchte ich eine Funktion der Lage zurückzukehren, für jeden Vektor, einen booleschen Vektor der gleichen Länge und deren Koeffizienten TRUE erzeugen, wenn der Wert tritt vor dem Maximum und FALSE sonst:

f <- function(x) 1:length(x) <= which.max(x) 

Dann würde ich diese Funktion zu jedem Untervektor von tn vom ID definiert gelten:

ind <- as.logical(ave(df$tn, df$ID, FUN=f)) 

schließlich alles, was ich zu tun habe, ist die entsprechende Teilmenge des ursprünglichen Datenrahmens zu nehmen:

df[ind, ] 
+0

Danke @Vinc ent Guillemot. Ich kann sehen, dass das sehr elegant funktionieren würde. Im Moment ist tn Struktur eine Zahl, und ich bekomme einen Fehler "Fehler in unique.default (x, nmax = nmax): unique() gilt nur für Vektoren". Ich habe versucht, es in einen Vektor unter Verwendung von as.vector zu zwingen, aber es bleibt eine Zahl und ich bekomme immer noch den Fehler. Weißt du, was ich tun könnte, um das zu beheben? Vielen Dank, Annemarie – Annemarie

+0

Sorry, ich habe einen [klassischen Fehler bei der Verwendung von ave] gemacht (http://stackoverflow.com/questions/16681770/r-error-in-unique-defaultx-unique-applies-only-to-vectors) : Ich habe es korrigiert und es sollte jetzt funktionieren. –

+0

Danke @ Vincent Guillemot. Kann ich noch eine schmerzhafte Frage stellen? Ich kann es immer noch nicht zur Arbeit bringen, und ich frage mich, ob das daran liegt, dass ich einige fehlende Werte für tn (sowohl vor als auch nach dem Maximalwert) habe? Gibt es ein "na.rm" Typ Manöver, das helfen würde? Nochmals vielen Dank, Annemarie – Annemarie

0

Sie könnten versuchen:

df %>% group_by(ID) %>% slice(seq_len(which(tn == max(tn,na.rm=TRUE)))) 
Source: local data frame [6 x 5] 
Groups: ID [3] 

    ID day tn hb sofa 
    (int) (int) (int) (int) (int) 
1  1  1  7 85 10 
2  1  2 15 84 12 
3  1  3 35 80 13 
4  2  1 500 76 12 
5  3  1 60 80 12 
6  3  2 75 75 10