2016-06-30 19 views
0

Ich möchte eine zuverlässige Verbesserung oder Verschlechterung von Sitzung 1 bis zur "letzten Sitzung" in einem unsymmetrischen Datensatz im Langformat berechnen.Berechne zuverlässige Verbesserung vor der Bewertung von unausgeglichenen Daten im Langformat

Die Daten habe ich wie folgt aussieht:

ID <- c("A","A","B","B","B","C","C","C","C") 
Session <-c(1,2,1,2,3,1,2,3,4) 
Value <- c(10,6,25,35,15,20,25,35,35) 
Have <- data.table(ID,Session,Value) 
Have 

ID Session Value 
A  1 10 
A  2  6 
B  1 25 
B  2 35 
B  3 15 
C  1 20 
C  2 25 
C  3 35 
C  4 35 

Die Daten i wie folgt aussehen müsste:

Change <- c(-4,-4,-10,-10,-10,15,15,15,15) 


Need <- data.table(ID,Session, Value,Change) 
Need 

ID Session Value Change 
A  1 10 -4  
A  2  6 -4  
B  1 25 -10 
B  2 35 -10 
B  3 15 -10 
C  1 20 15  
C  2 25 15  
C  3 35 15  
C  4 35 15  

ich das versucht:

Have$change<-as.vector(unlist(tapply(Have$Value,Have$ID,FUN=function(x){return (x-rep(x[1],length(x)))}))); 
Have 
ID Session Value change 
A  1 10  0 
A  2  6  -4 
B  1 25  0 
B  2 35  10 
B  3 15 -10 
C  1 20  0 
C  2 25  5 
C  3 35  15 
C  4 35  15 

I-Code verwendet von diesem Beitrag Calculating change from baseline with data in long format

Antwort

0

Nicht der hübscheste Code aber tut was du willst, denke ich. Ich weiß nicht wirklich data.table so dplyr stattdessen verwendet. Ich habe auch ein wenig Hilfe, wie man aus dieser Frage erste und letzte wählen https://stackoverflow.com/a/31529043/4651564

library(dplyr) 

Have <- as.data.frame(Have) 

Have2 <- Have %>% 
    group_by(ID) %>% 
    arrange(Session) %>% 
    filter(row_number() %in% c(1 , n())) %>% 
    summarise(change = diff(Value) ) 


Have %>% left_join (Have2 , by = "ID") 

edit: Aktualisiert meinen Code ein bisschen es

+0

Hallo Dank für Ihre Antwort zu vereinfachen! Der Code funktioniert im obigen Beispiel einwandfrei. Ich habe es auf meinem ursprünglichen Datensatz versucht, aber es gibt "Fehler: einen einzelnen Wert zu erwarten" zurück ... Die ursprünglichen Daten sind ein data.frame wie in dem Beispiel. Ich habe die ID-Variable in meinem Datensatz von Faktor zu Zeichen geändert (wie im Beispiel), aber ich bekomme immer noch den Fehler. Die ID-Variable sieht beispielsweise wie folgt aus: "BNCS01", Sitzung ist numerisch (im Beispiel identisch, reicht aber von 1 bis 29) und Wert ist ein Zahlenbereich von 0 bis 40 (mit 3 Dezimalstellen). Irgendwelche Vorschläge, warum ich die Fehlermeldung bekomme? – Carl

+0

Hallo @Carl, ich würde vermuten, dass dieses Problem darin besteht, dass eine Ihrer Gruppen nur eine Beobachtung hat. Ich habe nicht berücksichtigt, dass, wenn nur eine Beobachtung an "diff" übergeben wird, ein Vektor der Länge 0 zurückgegeben wird, wo dplyr einen Vektor der Länge 1 erwartet. Um das zu lösen, können Sie einfach Ihre eigene diff-Funktion schreiben und verwenden bietet den zusätzlichen Vorteil, Ihnen mehr Kontrolle darüber zu geben, wie Sie mit fehlenden oder fehlenden Werten umgehen. Sie könnten zum Beispiel die folgende 'DIFF <- Funktion (x) verwenden: { ### Entfernen von NAs x <- x [! Is.na (x)] if (length (x) == 0) return (NA) sonst zurück (max (x) - min (x)) } ' – CroGo