Ich versuche, zwei separate Listen von Variablennamen in eine data.table (v1.9.4) zu übergeben. Es gibt die richtigen Spalten zurück, aber es entfernt die Variablennamen. Dies funktioniert wie erwartet:Kombinieren mehrerer Listen von Variablennamen in data.table?
dt <- data.table(a=1:3, b=4:6, c=7:9, d=10:12)
dt
a b c d
1: 1 4 7 10
2: 2 5 8 11
3: 3 6 9 12
Es funktioniert auch eine einzelne Liste von Namen zu übergeben:
dt[,list(a,b)]
a b
1: 1 4
2: 2 5
3: 3 6
Aber wenn ich mehrere Listen übergeben müssen, gibt es die richtigen Spalten, sondern streift die Variablennamen :
dt[,c(list(a,b), list(c,d))]
V1 V2 V3 V4
1: 1 4 7 10
2: 2 5 8 11
3: 3 6 9 12
Warum zwei Listen? Ich verwende mehrere quote() 'd Listen von Variablen. Ich habe FAQ-Frage 1.6 gelesen, und ich weiß, dass eine Problemumgehung ist, einen Zeichenvektor zu verwenden, der mit = FALSE verwendet. Aber meine realen Anwendungsfall beinhaltet eine Mischung aus Namen vorbei und Ausdrücke auf eine Funktion, zB
varnames <- quote(list(a,b))
expr <- quote(list(a*b, c+d))
function(dt, varnames, expr) {
dt[,c(varnames, expr)]
}
Und ich möchte die „VarNames“ Spalten ihren richtigen Namen haben (und sie tun, wenn Sie nur passieren einzige Liste wie
dt[,list(a,b,a*b,c+d)]
a b V3 V4
1: 1 4 4 17
2: 2 5 10 19
3: 3 6 18 21
Wie kann ich mehrere Listen in einer data.table so kombinieren, dass sie immer noch die richtigen Spaltennamen zurück? (ich bin nicht ganz sicher, ob dies ein data.table Problem ist, oder wenn ich Ich mache gerade etwas albernes in der Art, wie ich Listen in R zu kombinieren versuche, aber c() scheint zu tun, was ich will.)
Es funktioniert mit benannten Listen, nicht sicher, ob das für Ihre Zwecke akzeptabel wäre. 'dt [, c (Liste (a = a, b = b), Liste (c = c, d = d))]' –
Interessant - danke! Das ist sicherlich eine Problemumgehung, und es ist besser als die Problemumgehung von 1.6, da das auch mit Ausdrücken funktioniert (nicht nur Variablennamen). Aber ich würde immer noch gerne wissen, ob es eine Möglichkeit gibt, unbenannte Listen zu kombinieren, so dass es mit der regulären (sauberen!) Data.table-Syntax funktioniert. (Oder wenn ich mit der Art und Weise, wie ich zitierte Listen kombiniere, etwas Dummes mache.) – cauchy
@cauchy Du machst nichts falsches, 'data.table' macht Dir nur einen Gefallen im einfachen Listenfall, indem Du den unbenannte Liste in eine benannte, aber es kann nicht in komplizierteren Fällen tun, da die Absicht nicht klar ist – eddi