2016-06-03 14 views
0

Ich möchte eine Spalte zu einer data.table hinzufügen. Der Name dieser neuen Spalte muss jedoch aus einem Zeichenvektor extrahiert werden. Ich schreibe dies:Fügen Sie in R data.table eine Spalte hinzu, deren Name auf einer Zeichenfolge basiert.

add_var=function(index){ 
    label=c("products","price") 
    var_name=label[index] 
    df=data.frame(x=c(1,2,5,9),y=c(5,2,6,7)) 
    dt=as.data.table(df) 
    dt[,(as.name(var_name)):=5] 
    return(dt) 
} 
new_ds=add_var(1) 

Und ich erwartete etwas wie

x y products 
1 5  5 
2 2  5 
5 6  5 
9 7  5 

Aber stattdessen bekam ich diese Fehlermeldung:

Error in `[.data.table`(dt, , `:=`((as.name(var_name)), 5)) : 
    LHS of := must be a symbol, or an atomic vector (column names or positions). 

Wer weiß, wie meine Funktion zu beheben, es zu machen Arbeit?

+2

Sie 'nicht as.name' dort verwenden. ': =' erwartet einen Zeichenvektor auf der LHS. Sie können eine data.table auch direkt mit 'data.table' konstruieren. Schließlich verwenden Sie 'return (dt [])', um [sicherzustellen, dass die data.table gedruckt wird] (http://stackoverflow.com/q/32988099/1412059) das erste Mal nach dem Aufruf der Funktion. – Roland

+0

Ich habe es, danke –

+0

Auch 'setDT (df)' ist mehr Speicher-effizient und viel schneller als 'dt = as.data.table (df)' –

Antwort

2

Sie müssen nur das:

label <- c("products","price") 
df <- data.frame(x=c(1,2,5,9),y=c(5,2,6,7)) 


setDT(df)[ , (label) := 5] 


#> x y label products price 
#> 1: 1 5  5  5  5 
#> 2: 2 2  5  5  5 
#> 3: 5 6  5  5  5 
#> 4: 9 7  5  5  5 
+0

Großartig! Kannst du mir mehr über setDT erzählen? Tatsächlich funktioniert es mit diesem Befehl setDT (dt) [, (var_name): = 5] –

+2

'setDT (df)' wandelt eine 'dat.frame' in eine' data.table' um, ohne sie in den Speicher zu kopieren. Sie können es auch in zwei getrennten Schritten tun, zuerst 'setDT (df)' und dann 'df [, (label): = 5]'. Wenn Sie es wieder in eine 'data.framte' konvertieren wollen, ist es einfach' setDF (df) ' –

+0

waouw! groß! Danke! –

Verwandte Themen