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
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
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