Manipulation eines Datenrahmens mit Inhalten aus einem anderen Datenrahmen ähnlich einem SQL -Join

StackOverflow https://stackoverflow.com/questions/2241583

  •  19-09-2019
  •  | 
  •  

Frage

Sagen Sie, ich habe einen Datenrahmen mit dem Inhalt:

Trial Person Time
1     John   1.2
2     John   1.3
3     John   1.1
1     Bill   2.3
2     Bill   2.5
3     Bill   2.7

und ein weiterer Datenrahmen mit dem Inhalt:

Person Offset
John   0.5
Bill   1.0

und ich möchte den ursprünglichen Frame basierend auf dem entsprechenden Wert aus dem zweiten ändern. Ich könnte dies leicht in jeder anderen Sprache oder in SQL tun, und ich bin sicher, ich könnte es schaffen, für Schleifen und was zu verwenden, aber mit allem anderen, was ich in R sehe, habe ich vermute, dass es eine besondere Syntax hat, um dies als eine zu tun -Liner. Also, wenn ja, wie? Und wenn nicht, könnten Sie zeigen, wie es mit Loops erledigt werden könnte. Ich habe noch nicht dazu gekommen, dass ich in R gelernt habe, da es erstaunliche Dinge gibt, um alle Werte einfach zu extrahieren und zu manipulieren.

Als Referenz würde die Ausgabe:

Trial Person Time
1     John   0.7
2     John   0.8
3     John   0.6
1     Bill   1.3
2     Bill   1.5
3     Bill   1.7 
War es hilfreich?

Lösung

Es gibt viele Möglichkeiten. Hier ist eine einfache Verwendung merge() und eine einfache säulenweise Subtraktion im vergrößerten data.frame:

R> DF1 <- data.frame(trial=rep(1:3,2), \
                     Person=rep(c("John","Bill"), each=3), \
                     Time=c(1.2,1.3,1.1,2.3,2.5,2.7))
R> DF2 <- data.frame(Person=c("John","Bill"), Offset=c(0.5,1.0))
R> DF <- merge(DF1, DF2)
R> DF
  Person trial Time Offset
1   Bill     1  2.3    1.0
2   Bill     2  2.5    1.0
3   Bill     3  2.7    1.0
4   John     1  1.2    0.5
5   John     2  1.3    0.5
6   John     3  1.1    0.5
R> DF$NewTime <- DF$Time - DF$Offset
R> DF
  Person trial Time Offset NewTime
1   Bill     1  2.3    1.0     1.3
2   Bill     2  2.5    1.0     1.5
3   Bill     3  2.7    1.0     1.7
4   John     1  1.2    0.5     0.7
5   John     2  1.3    0.5     0.8
6   John     3  1.1    0.5     0.6
R> 

Andere Tipps

Einzeiler:

transform(merge(d1,d2), Time=Time - Offset, Offset=NULL)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top