2016-12-24 5 views
0

Ich muss durch einen Datenrahmen durchlaufen, lesen Sie den Wert von drei Spalten (2 Zeitstempel und 1 Etikett). Dann muss ich für diese Reihe von drei Werten mit jeder Reihe eines zweiten Datenrahmens vergleichen, um zu sehen, ob A) die Markierung übereinstimmt und B) der Zeitstempel, der im zweiten Datenrahmen ist, zwischen den zwei Zeitstempeln der aktuellen Reihe liegt. Wenn die Zeile tatsächlich diese beiden Kriterien erfüllt, sollte sie zur weiteren Verarbeitung in einem Datenrahmen/Vektor gespeichert werden.Für jede Zeile in einem Datenrahmen, Schleife durch einen anderen Datenrahmen

Ich habe viele Versionen der Funktion x_apply in Kombination mit einer for-Schleife (für die 'zweite' Iteration) ausprobiert. Im Folgenden ist eine sehr vereinfachte Version meines Problems, wo ich zwei kleine Datenframes erstellen und versuchen, die erforderliche Schleife einzurichten. Der Wert sollte in 'x' gespeichert werden - und während dieser Wert angezeigt wird, wenn ich (x) in der Schleife drucke, wird 'x' als NULL angegeben, nachdem die Anwendungsfunktion abgeschlossen ist. Es scheint jedes Mal zurückgesetzt zu werden, wenn die Funktion aufgerufen wird. Unter Berücksichtigung meiner Anforderungen, haben Sie Ideen für einen anderen/besseren Ansatz? Ich bin nicht verpflichtet, per se anzuwenden. Vielen Dank im Voraus!

Update: Ein Beispiel mit Zeitangaben, was zu dem Fehler "Erwarte einen einzelnen Wert" für mich führt.

label <- c("p1", "p1", "p2") 
value_1 <- c(as.POSIXct(1482645600, origin="1970-01-01"),as.POSIXct(1482745600, origin="1970-01-01"),as.POSIXct(1482845600, origin="1970-01-01")) 
value_2 <- c(as.POSIXct(1582645600, origin="1970-01-01"),as.POSIXct(1582745600, origin="1970-01-01"),as.POSIXct(1582845600, origin="1970-01-01")) 
df1 <- data.frame(label, value_1, value_2) 
label <- c("p1", "p2", "p2") 
value_3 <- c(as.POSIXct(1582645100, origin="1970-01-01"),as.POSIXct(1582745200, origin="1970-01-01"),as.POSIXct(1582845300, origin="1970-01-01")) 
df2 <- data.frame(label, value_3) 

df_merge = merge(df1, df2, c("label"), suffixes = c(".df1",".df2")) 
setDT(df_merge) 
str(df_merge) 
a <- df_merge[between(value_3, value_1, value_2), ] 
+2

merge zuerst und dann wenden Sie Ihre Reichweitenbedingungen an! –

Antwort

1

ist das wonach Sie suchen?

library(data.table) 
setDT(df1) 
setDT(df2)  
setkey(df1, label) 
setkey(df2, label) 
df1[df2] # here i merge both the data.table 

df3[between(value_3, value_1, value_2), ] # apply the condition 
# label value_1 value_2 value_3 
#1: p1  8  10  8 
#2: p2  2  9  8 
#3: p2  2  9  8 

mit einigen Daten in Daten:

# ensure the dates are in proper formats(i had simulated some sample data with dates. just sharing the last 2 steps output) 
df3$value_1 = as.Date(df3$value_1, format= "%d/%m/%Y") 
df3$value_2 = as.Date(df3$value_2, format= "%d/%m/%Y") 
df3$value_3 = as.Date(df3$value_3, format= "%d/%m/%Y") 
# df3 
# label value_1 value_2 value_3 
#1: p1 2016-03-10 2016-03-20 2016-03-15 
#2: p1 2016-06-17 2016-06-19 2016-03-15 
#3: p2 2016-09-10 2016-09-20 2016-06-21 
#4: p2 2016-09-10 2016-09-20 2016-09-12 

df3[between(value_3, value_1, value_2), ] 
# label value_1 value_2 value_3 
#1: p1 2016-03-10 2016-03-20 2016-03-15 
#2: p2 2016-09-10 2016-09-20 2016-09-12 
+1

Das ist großartig! Wenn ich den Zwischenruf auf POSIXct Werte verwende, bekomme ich jedoch den Fehler: "Fehler: erwarte einen einzelnen Wert". Irgendeine Idee, wie ich das lösen könnte? – WalterB

+1

Gedanken teilen Sie eine Beispieldaten mit Daten? Ich werde es untersuchen. Es wird eine einfache Lösung sein. Frohe Weihnachten ... in die Kirche gehen jetzt –

+0

vielen Dank und ein wunderbares Weihnachten für Sie :) Ich habe meine erste Frage mit einem Update bearbeitet, das einige weitere Beispieldaten enthält. Vielen Dank für Ihre Hilfe. – WalterB

1

Hier ist eine sehr kurze Lösung in Base R, wenn dies ist, was Sie suchen:

dfr <- merge(df1, df2, by="label", all=FALSE) 
subset(dfr, value_3 > value_1 & value_3 < value_2) 
Verwandte Themen