2016-08-03 11 views
1

Ich habe 7 Datensätze DF1..DF7 & al von ihnen die Daten in folgendem Format haben:neue Spalte, um mehrere Datenrahmen gleichzeitig Hinzufügen

Lowerbound Upperbound 
738.5349709 2418.259919 
734.5215381 2160.478003 
1826.381884 2753.12212 
452.3846655 3013.798816 
542.6524558 863.0564862 
399.4240401 2862.168099 

ich den Unterschied zwischen den 2 berechnet werden soll Spalten & eine dritte Spalte für alle Datensätze gleichzeitig & es add „Intervall“ .Ich nennen verwendet, um den folgenden Code ein:

filenames <- names(which(sapply(.GlobalEnv, is.data.frame))) 
for(i in seq_along(filenames)) { 
x <- get(filenames[i]) 
for(j in 1:length(x)) 
{ 
x$Interval[[j]] <- ((x$upper_bound[[j]] -x$lower_bound[[j]])/x$actual[[j]])/2 
} 
assign(filenames[i], x) 
} 

die Spalte „Intervall“ wird erzeugt, aber die bevölkerten Werte falsch sind: numerisch (0) ist das Ergebnis, das ich in der neuen Spalte sehen kann.

Kann jemand eine Verbesserung vorschlagen? Danke im Voraus!!

Antwort

1

Wir erhalten alle Datensätze in einem list mit mget verwenden lapply zu Schleife über die list Elemente, erstellen Sie eine neue Spalte ‚Interval‘ transform, indem man den Unterschied zwischen ‚Obergrenzen‘, ‚Untergrenze‘ und dividiert durch tatsächliche Verwendung '(nicht in Ihren Daten gesehen, aber ich denke, es ist schon da)

lapply(mget(paste0("DF", 1:7)), transform, 
       Interval = ((Upperbound - Lowerbound)/actual)/2) 
+0

Können Sie diesen Teil mehr erklären? (mget (paste0 ("DF", 1: 7)) – Mox

+0

@Mox 'paste0 (" DF ", 1: 7)' Erzeuge einen Vektor von Strings, dh Objektnamen als Strings, und 'mget' gibt den Wert jedes Strings zurück der String in einer "Liste" – akrun

2

Ihr Code ist Weg komplizierter, als es sein muss.

data$interval = data$Upperbound - data$Lowerbound 

Oder mit within:

data = within(data, interval = Upperbound - Lowerbound) 

Jetzt gilt dies für alle Ihre Datenrahmen: Sie können einfach zwei Vektoren in R subtrahieren

filenames = mget(paste0('DF', 1 : 7)) 
filenames = lapply(filenames, function (data) within(data, interval = Upperbound - Lowerbound)) 

(Beachten Sie, dass dies erstellen eine neue Liste Ihrer Datenrahmen, anstatt die ursprünglichen zu ändern.)

Noch besser, füge alle Daten in einen einzelnen Datenrahmen mit einer zusätzlichen Spalte zusammen, die den Ursprung angibt.

+0

'innerhalb' funktioniert nicht mit räumlichen Datenrahmen – Mox