2016-08-25 2 views
0

Ich versuche, eine neue Spalte zu einem Datenrahmen mit einem angegebenen Spaltennamen hinzuzufügen.Funktionsausdruck funktioniert nicht als Spaltenname in R

Dies funktioniert:

dat = data.frame(x1 = 1:10, 
       x2 = 101:110, 
       x3 = 1:2, 
       x4 = 2:1) 

cbind(dat, 'x10' = 1:10) 

Ergebnis:

x1 x2 x3 x4 x10 
1 1 101 1 2 1 
2 2 102 2 1 2 
3 3 103 1 2 3 
4 4 104 2 1 4 
5 5 105 1 2 5 
6 6 106 2 1 6 
7 7 107 1 2 7 
8 8 108 2 1 8 
9 9 109 1 2 9 
10 10 110 2 1 10 

aber nicht mit einem funktionellen Ausdruck als Spaltenname

cbind(dat, paste0('x10', '_flag') = 1:10) 

Error: unexpected '=' in "cbind(dat, paste0('x10', '_flag') ="

Arbeit wurde ich von

Denken
column_name = paste0('x10', '_flag') 
cbind(dat, column_name = 1:10) 

aber es wird „column_name“ als Spaltennamen nehmen, anstatt die Zeichenkette, die es sich bezieht (@ 42- dankt mir für die Korrektur)

Wie R lassen paste0() wissen, ist nur ein String? Ich habe versucht as.character(paste0()) und es hat nicht funktioniert. Jede Hilfe wird geschätzt. Vielen Dank!

+0

Leider interpretiert die zweite Methode den 'column_name' nicht, so dass Sie mit 'dat $ column_name' eher 1:10 als erhofft haben. Die Ausdrücke für Namen von Argumenten werden nicht in den Funktionen übergeben. Sie können Interpretationen von Ausdrücken erhalten, die mit "assign" (in der ersten Argumentposition) zu Zeichenwerten ausgewertet werden, aber das Ergebnis ist eine sehr sperrige Art von Code und bedeutet im Allgemeinen, dass es bessere Alternativen gibt. –

Antwort

5

Anstatt cbind verwenden, sollten Sie lernen "[" zu verwenden, da es berechnet Spaltennamen in der j-Argumente Position akzeptiert (nach dem ersten Komma):

> dat[ , paste0('x10', '_flag') ] = 1:10 
> dat 
    x1 x2 x3 x4 x10_flag 
1 1 101 1 2  1 
2 2 102 2 1  2 
3 3 103 1 2  3 
4 4 104 2 1  4 
5 5 105 1 2  5 
6 6 106 2 1  6 
7 7 107 1 2  7 
8 8 108 2 1  8 
9 9 109 1 2  9 
10 10 110 2 1  10 

Dies entspricht eine ähnliche Strategie mit „[[“

dat[[ paste0('x10', '_flag') ]] = 1:10 

Hinweis: dies vermeidet unglückliche Neuling Bemühungen berechnet Spaltennamen zu erhalten einzusetzendes $