2016-07-12 18 views
2

ich zwei Datenrahmen haben (DF1 und DF2), ein Beispiel davon, wie diese aussieht:neue Spalten basierend auf Übereinstimmung zwischen zwei vorhandenen Spalten aus zwei Datenrahmen

df1 <- data.frame(StationID = c(1,1,1,2,2,3,3,3,3,3), 
       Cameras  = c("Cam1","Cam2","Cam2","Cam1","Cam1","Cam2","Cam1","Cam2","Cam1","Cam1"), 
       Start   = c("2013-04-23","2013-04-23","2013-04-23","2013-04-23","2013-04-23","2013-04-23","2013-04-23","2013-04-23","2013-04-23","2013-04-23"), 
       End   = c("2013-04-25","2013-04-25","2013-04-25","2013-04-25","2013-04-25","2013-04-25","2013-04-25","2013-04-25","2013-04-25","2013-04-25")) 


df2 <- data.frame(StationID = c(1,1,2,2,3,3), 
        Cameras = c("Cam1","Cam2","Cam1","Cam2","Cam1","Cam2")) 

ich produzieren wollen Neuer Datenrahmen (df3), der nach einer Übereinstimmung zwischen zwei Spalten (StationID und Kameras) sucht und dann die Spalten "Start" und "Ende" an die entsprechenden Übereinstimmungen anfügt. Der Code muss basierend auf den Daten dynamisch neue Spalten hinzufügen, da einige Instanzen keine Übereinstimmungen aufweisen, während andere viele Übereinstimmungen aufweisen.

Beispiel Ausgabe unter:

StationID Cameras  Start1  End1  Start2  End2  Start3  End3 
1   1 Cam1 2013-04-23 2013-04-25  <NA>  <NA>  <NA>  <NA> 
2   1 Cam2 2013-04-23 2013-04-25 2013-04-23 2013-04-25  <NA>  <NA> 
3   2 Cam1 2013-04-23 2013-04-25 2013-04-23 2013-04-25  <NA>  <NA> 
4   2 Cam2  <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
5   3 Cam1 2013-04-23 2013-04-25 2013-04-23 2013-04-25 2013-04-23 2013-04-25 
6   3 Cam2 2013-04-23 2013-04-25 2013-04-23 2013-04-25  <NA>  <NA> 

ich diese Aufgabe jede Hilfe dankbar würde.

Vielen Dank im Voraus!

Antwort

2

wir die beiden Datensätze on ‚StationID‘ beitreten und ‚Kameras‘ und verwenden dcast von data.table die value.var Spalten mehrere dauern kann ‚breit‘ Format neu zu gestalten.

library(data.table)#1.9.7+ 
dcast(setDT(df1)[df2, on = c("StationID", "Cameras")], 
    StationID + Cameras ~rowid(StationID, Cameras), value.var = c("Start", "End")) 
# StationID Cameras Start_1 Start_2 Start_3  End_1  End_2  End_3 
#1:   1 Cam1 2013-04-23   NA   NA 2013-04-25   NA   NA 
#2:   1 Cam2 2013-04-23 2013-04-23   NA 2013-04-25 2013-04-25   NA 
#3:   2 Cam1 2013-04-23 2013-04-23   NA 2013-04-25 2013-04-25   NA 
#4:   2 Cam2   NA   NA   NA   NA   NA   NA 
#5:   3 Cam1 2013-04-23 2013-04-23 2013-04-23 2013-04-25 2013-04-25 2013-04-25 
#6:   3 Cam2 2013-04-23 2013-04-23   NA 2013-04-25 2013-04-25   NA 

Hinweis: Um die rowid vom data.table_1.9.7 ist. Es kann von here installiert werden. Wenn wir die Version 1.9.6 oder älter haben, erstellen Sie die Rowid von

dN <- setDT(df1)[df2, on = c("StationID", "Cameras") 
        ][, rid := 1:.N, .(StationID, Cameras)] 

und führen Sie dann die dcast

dcast(dN, StationID + Cameras ~rid, value.var = c("Start", "End")) 
+0

danke für diesen Vorschlag. Es scheint genau das zu sein, wonach ich suche. Wenn ich den Code ausführe, erhalte ich den folgenden Fehler (Fehler in eval (expr, envir, enclos): Funktion "rowid" konnte nicht gefunden werden). Was mache ich hier falsch? – Ross

+2

Ich habe es geschafft, das funktioniert. Ich hatte die CRAN-Version von data.table und nicht die Entwicklungsversion (v.1.9.7), die die rowid-Funktion enthält. Für diejenigen, die auf diese Version zugreifen müssen, gehen Sie einfach zu https://github.com/Rdatatable/data.table/wiki/Installation. Nochmals vielen Dank für die Hilfe von allen! – Ross

0

Vielleicht ist das hilfreich

library(dplyr) 
library(tidyr) 
full_join(df1,df2) %>% group_by(StationID,Cameras) %>% summarise_each(funs(toString)) %>% separate(col = Start,into = paste("Start",1:3,sep=""),sep=", ",extra="merge") %>% separate(col = End,into = paste("End",1:3,sep=""),sep=", ",extra="merge") 
+0

Vielen Dank für diesen Vorschlag. Dies scheint zu einem gewissen Grad zu funktionieren; Station2 Kamera2 fehlt. Ich schätze, das liegt an all den NAs, aber gibt es eine Möglichkeit, alle Datensätze in DF3 zu behalten, einschließlich derer, die alle NAs umfassen? Danke – Ross

+0

@Ross: hinzugefügt, dass. Tut mir leid, ich habe es nicht bemerkt. – user2100721

Verwandte Themen