2017-03-12 1 views
2

Ich versuche, Werte aus einer Nachschlagetabelle zu verwenden, um entsprechende Werte in einer Haupttabelle zu multiplizieren. Anwenden einer Funktion über mehrere Spalten

Dies ist ein Beispiel einiger Daten

Die aufblicken

lu = structure(list(year = 0:12, val = c(1.6422, 1.6087, 1.5909, 1.4456, 
1.4739, 1.4629, 1.467, 1.4619, 1.2588, 1.1233, 1.1664, 1.1527, 
1.2337)), .Names = c("year", "val"), class = "data.frame", row.names = c(NA, 
-13L)) 

Hauptdaten

dt = structure(list(year = c(3L, 4L, 6L, 10L, 3L, 9L, 10L, 7L, 7L, 
1L), x = 1:10, y = 1:10), .Names = c("year", "x", "y"), row.names = c(NA, 
-10L), class = c("data.table", "data.frame")) 

kann ich die Ergebnisse, die ich möchte produzieren, durch Zusammenführung und dann eine Spalte in eine Multiplikation Zeit

library(data.table) 

dt = merge(dt, lu, by = "year") 
dt[, xnew := x*val][, ynew := y*val] 

Allerdings habe ich viele Variablen, um dies zu übernehmen. Es gab viele Fragen dazu, aber ich kann es nicht zur Arbeit bekommen.

Mit Ideen von How to apply same function to every specified column in a data.table und R Datatable, apply a function to a subset of columns, versuchte ich

dt[, (c("xnew", "ynew")):=lapply(.SD, function(i) i* val), .SDcols=c("x", "y")] 

Fehler bei FUN (X [[i]], ...): Objekt 'val' nicht gefunden

for (j in c("x", "y")) set(dt, j = j, value = val* dat[[j]]) 

Fehler in set (dt, j = j, Wert = val * dt [[j]]): Objekt 'val' nicht gefunden

Und nur die Multiplikation zu versuchen, ohne Zuweisen (von Data table - apply the same function on several columns to create new data table columns) hat auch nicht funktioniert.

dt[, lapply(.SD, function(i) i* val), .SDcols=c("x", "y")] 

Fehler bei FUN (X [[i]], ...): Objekt 'val' nicht gefunden

Bitte könnten Sie meine Fehler hinweisen. Vielen Dank.

Ich benutze data.table version v1.9.6.

+0

Angabe Es funktioniert für mich. Haben Sie auf die neueste Version von 'data.table' aktualisiert? (was 1.10.4 ist) – Jaap

+0

Im bei v1.9.6. Ich kann auf meinem Heim-PC aktualisieren, um Akrun's Antwort zu versuchen, aber ich werde auf Version 1.9.6 bei der Arbeit beschränkt sein. (Dachte nicht, dass Version ein Problem wäre, da die anderen Fragen ein paar Jahre alt waren). Ich füge Details zur Frage hinzu. – user2957945

+0

Es sollte in 1.9.6 auch funktionieren AFAIK – Jaap

Antwort

2

Wir können versuchen, beitreten und dann durch .SDcols

dt[lu, on = .(year), nomatch =0 
    ][, c("x_new", "y_new") := lapply(.SD, `*`, val), .SDcols = x:y][] 
+0

danke. * konnte die Funktion "." * nicht finden. Ich werde meine Paketversion aktualisieren – user2957945

+1

@ user2957945 Ich denke, das ist ein Update-Problem – akrun

+0

@ user2957945 Wenn Sie Probleme bei der Installation der neuen Version haben, versuchen Sie mit 'https://github.com/Rdatatable/data.table/wiki/Installation Um die Entwicklungsversion – akrun

Verwandte Themen