2016-04-15 5 views
0

Ich habe einen Datensatz von wiederholten Messungen (hb) über die Zeit (Tag) für verschiedene Patienten (record_id). Ich würde gerne den Nadir Wert von HB für jeden Patienten finden, und dann verwenden Sie es eine kategorische Variable, die die Patienten in "niedrigen Nadirhb" (< 70), "Mitte Nadirhb" (70-90) und "High Nadirhb" (> 90). Ich würde für Ihre Hilfe sehr dankbar sein, wie ich ganz fest am ...neue kategoriale Variable basierend auf Min-Wert für jeden Patienten erstellen

record_id Day hb 
1 0 122 
1 1 90 
1 2 71 
1 3 71  
2 0 139 
2 1 130 
2 2 119 
2 3 106 
3 0 89 
3 1 126 
3 2 127 
3 3 110 
4 0 90 
4 1 86 
4 2 82 
4 3 78 
5 0 118 
5 1 108 
5 2 95 
5 3 94 

ich den Code unten versucht, aber ich kann nicht fusionieren df und x1:

x1 <- aggregate(hb~record_id, data=df, FUN=function(df) c(min=min(df), count=length(df))) #this successfully finds the min hb for each patient 
x1<- rename(x1, c("hb" = "nadirhb")) 
x1 <- as.data.frame(x1) 
m=merge(df,x1,by="record_id") 
summary(df$nadirhb) 
#create hb categorical variable 
df$hbcat[df$nadirhb >=90] <- 2 
df$hbcat[df$nadirhb >=70 & df$hb <90] <- 1 
df$hbcat[df$nadirhb <70] <- 0 
table(df$hbcat) 

Antwort

1

Mit dplyr Marken das ist intuitiv.

library(dplyr) 

# get min value for each record 
df <- df %>% group_by(record_id) %>% mutate(min_hb = min(hb)) 

# create categorical variable dividing patients into segments 
df <- df %>% mutate(hb_segment = ifelse(min_hb < 70, "low", 
          ifelse(min_hb < 90, "middle", "high"))) 

Dann Spalten auswählen und

# filter to single row per patient 
df_patient <- df %>% 
    select(record_id, min_hb, hb_segment) %>% 
    distinct() 

Ergebnis

record_id min_hb hb_segment 
     (int) (int)  (chr) 
1   1  71  middle 
2   2 106  high 
3   3  89  middle 
4   4  78  middle 
5   5  94  high 

EDIT pro Patient einreihige filtern: wie Steven Beaupre in den Kommentaren darauf hingewiesen, können Sie auch dies tun können:

df %>% group_by(record_id) %>% 
    summarise(min_hb = min(hb)) %>% 
    mutate(hb_segment = ifelse(min_hb < 70, "low", ifelse(min_hb < 90, "middle", "high"))) 

wh Ich bin ein bisschen kürzer

+1

Sie könnten vereinfachen mit 'summarize()'. Vielleicht etwas in diesen Zeilen: 'df%>% group_by (record_id)%>% zusammenfassen (min_hb = min (hb))%>% mutieren (hb_segment = ifelse (min_hb <70," niedrig ", ifelse (min_hb <90, "mittel", "hoch"))) ' –

+0

@JohnSG das sieht wirklich elegant aus, und ich kann sehen, dass es funktionieren sollte! Wenn ich dies jedoch auf den gesamten Datensatz anwende, 'df <- df %>% group_by (record_id)%>% muate (min_hb = min (hb)) zusammenfassung (df $ min_hb) > min. 1. Qu. Mittlerer Mittelwert 3rd Qu. Max. NA's NA NA NA NaN NA NA 1426' Ich bekomme, dass sie alle fehlende Werte sind. Ich habe Werte in meinem Dataset verloren, aber ich habe versucht, na.rm = TRUE ohne Verbesserung hinzuzufügen. Vielen Dank – Annemarie

+1

Ich habe es !! Es ist, weil plyr geladen wurde. Die Entfernung von diesem hat alle Probleme gelöst !! Danke – Annemarie

Verwandte Themen