2017-01-18 5 views
1

Ich habe ziemlich viel gesucht und keine Frage gefunden, die dieses Problem angeht - aber wenn das beantwortet wurde, verzeih mir, ich bin immer noch ziemlich grün, wenn es um das Codieren im Allgemeinen geht . Ich habe einen Datenrahmen mit einer großen Anzahl von Variablen, die ich gerne kombinieren würde & neue Variablen basierend auf Namen erstellen, die ich in einem 2. Datenrahmen in einer Schleife gesetzt habe. Der Datenrahmen formulas sollte & Aufruf Spalten von der Hauptdatenrahmen erstellen dataAufruf und Erstellen neuer Spalten basierend auf String

USDb = c(1,2,3) 
USDc = c(4,5,6) 
EURb = c(7,8,9) 
EURc = c(10,11,12) 
data = data.frame(USDb, USDc, EURb, EURc) 

Jetzt würde ich data$USDa eine neue Spalte erstellen möchten, wie durch

data$USDa = data$USDb - data$USDc 

definiert und so weiter für EUR und andere Variablen. Dies ist leicht genug, um manuell zu tun, aber ich möchte eine Schleife erstellen, die die Namen von formulas, so etwas wie dies zieht:

a = c("USDa", "EURa") 
b = c("USDb", "EURb") 
c = c("USDc", "EURc") 
formulas = data.frame(a,b,c) 

for (i in 1:length(formulas[,a])){ 
    data$formulas[i,a] = data$formulas[i,b] - data$formulas[i,c] 
    } 

Offensichtlich data$formulas[i,a] diese NULL zurückkehrt, also habe ich versucht data$paste0(formulas[i,a]) und kehrt Error: attempt to apply non-function

Wie kann ich diese Zeichenfolgen als Variablen auf diese Weise erkannt bekommen? Vielen Dank.

Antwort

0

Logik: durch jede der Formeln laufen, eine apply verwendet, die eine for Schleife intern ist und die Berechnung tun auf der Grundlage der Formel

x = apply(formulas, 1, function(x) data[[x[3]]] - data[[x[2]]]) 
colnames(x) = formulas$a 
x 
#  USDa EURa 
#[1,] 3 3 
#[2,] 3 3 
#[3,] 3 3 

cbind(data, x) 
# USDb USDc EURb EURc USDa EURa 
#1 1 4 7 10 3 3 
#2 2 5 8 11 3 3 
#3 3 6 9 12 3 3 
+0

ja, diese Lösung gearbeitet die tatsächlichen Daten, die ich habe und für mich scheint eleganter als Looping. Danke für die Anleitung. – chrstnsn

1

Es gibt einfachere Wege, dies zu tun, aber ich bleibe zu den meisten Ihrer Code als ein Mittel zur Erklärung. Der Code sollte so lange arbeiten, wie Sie Ihre for-Schleife auf die folgende bearbeiten:

for (i in 1:length(formulas[,"a"])){ 
    data[formulas[i,"a"]] = data[formulas[i,"b"]] - data[formulas[i,"c"]] 
} 
  1. formulas[,a] wird nicht funktionieren, weil Sie eine Variable definiert als a bereits, dass innerhalb eines Index nicht geeignet ist. Verwenden Sie stattdessen formulas[, "a"], wenn Sie alle Zeilen aus der Spalte "a" in data.frame formulas möchten.
  2. data$formulas ist buchstäblich die Suche nach der Spalte namens "Formeln" im data.frame data. Stattdessen wollen Sie data[formulas] (natürlich wissen, dass Sie formulas, um zu indizieren muss es eine richtige Zeichenfolge zu machen) schreiben
0

Eine weitere Option ist split mit sapply

sapply(setNames(split.default(as.matrix(formulas[-1]), 
    row(formulas[-1])), formulas$a), function(x) Reduce(`-`, data[rev(x)])) 
#  USDa EURa 
#[1,] 3 3 
#[2,] 3 3 
#[3,] 3 3 
Verwandte Themen