2016-03-25 3 views
0

Ich möchte eine Funktion erstellen, die eine Reihe neuer Variablen basierend auf übereinstimmenden Spalten in zwei Datenrahmen erstellen wird. Hier einige Daten:Wie erstelle ich eine Funktion, die auf einer Spalte übereinstimmt und dann die nächste Beobachtung einer anderen Spalte ergreift?

A <- structure(list(obs = c(1, 2, 3), start.time = c(2, 5, 10)), .Names = c("obs", "start.time"), row.names = c(NA, -3L), class = "data.frame") 
B <- structure(list(time.2 = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11), value = c(5, 15, 17, 21, 3, 14, 10, 4, 1, 33, 13)), .Names = c("time.2", "value"), row.names = c(NA, -11L), class = "data.frame") 

Ich versuche, die start.time von data.frame A an die time.2 Spalte von data.frame B zu entsprechen, und dann, sobald das angepasst ist, nehmen Sie einen iterativen Schritt von der Wert Spalte B eine neue Variable in A. erstellen Hier kann die Funktion ist, ich habe (ich bin nicht sicher, dass es genau so, wie geschrieben ist es sein soll):

f1 <- function(x1, y1){B[x1==(time.2 - y1),]$value} 

zum Beispiel, ich will

f1(A$start.time, 1) 

um die Werte (17, 14, 1 3).

Und

f1(A$start.time, 2) 

die Werte zurück (21, 10, NA).

Ich möchte dies für eine Folge von Zahlen, sagen wir 1: 2, und erstellen Sie Variablen in der A data.frame auf dem Weg. Das wäre A $ newvar.1 würde enthalten (17, 14, 13) und A $ newvar.2 würde (21, 10, NA) enthalten.

Ich habe versucht, dies über Mapply, aber ich bin nicht zu weit. Jede Hilfe würde sehr geschätzt werden!

+0

Ich verstehe den Minus-y1-Teil nicht. du willst wissen _ 'which'_ time.2 von B ist gleich x1 und stell dich dann mit y1 ein, du hast genau das Gegenteil jetzt – rawr

Antwort

0
fun1 <- function(x, y, n){ 
    y$value[match(x$start.time + n, y$time.2)] 
} 
fun1(A, B, 1) 
#[1] 17 14 13 
fun1(A, B, 2) 
#[1] 21 10 NA 

Wie pro Ihren Kommentar, ich glaube, wenn Sie eine Liste mit mehreren n erstellen möchten, dann ist der beste Weg zu gehen ist ein Vektor mit n ist und lapply die Funktion zu erzeugen, dh

v1 <- c(1:3) 
lapply(v1, function(i) fun1(A, B, i)) 
#[[1]] 
#[1] 17 14 13 

#[[2]] 
#[1] 21 10 NA 

#[[3]] 
#[1] 3 4 NA 
+0

Das hat funktioniert! Vielen Dank! – ewingam

+0

Wenn ich eine längere Liste von Variablen erstellen möchte, was wäre der beste Weg, um das zu erreichen? Zum Beispiel möchte ich var.1, var.2, ..., var.n. – ewingam

+0

@ewingam siehe bearbeitete Antwort. Ist es das, was du meintest? – Sotos

Verwandte Themen