2015-05-06 14 views
10

Gibt es eine Möglichkeit, in Variablen gespeicherte Strings als Spaltennamen in einem neuen Datenrahmen zu verwenden? Das erwartete Ergebnis sollte sein:Variable als Spaltenname im Datenrahmen

col.name <- 'col1' 
df <- data.frame(col.name=1:4) 
print(df) 

# Real output 
    col.name 
1  1 
2  2 
3  3 
4  4 

# Expected output 
    col1 
1 1 
2 2 
3 3 
4 4 

ich bewusst bin, dass ich Datenrahmen erstellen und verwenden dann Namen() Spalte umbenennen oder df verwenden [, col.name] für bestehende Objekt, sondern Ich würde gerne wissen, ob es eine andere Lösung gibt, die beim Erstellen eines Datenrahmens verwendet werden könnte.

+1

'data.frame (col1 = 1: 4)' gibt Ihnen die "erwartete Ausgabe" – Jeff

+3

@ Jeff aber er will weitergeben ' "col1"' von einer variablen – shadowtalker

+0

By the way, ich habe Diese Frage wurde markiert, um zu Stack Overflow verschoben zu werden, da es um die Programmierung in R geht und nicht um Statistiken. – shadowtalker

Antwort

14

Sie können eine Variable nicht in den Namen eines solchen Arguments übergeben.

Stattdessen, was Sie tun können, ist:

df <- data.frame(placeholder_name = 1:4) 
names(df)[names(df) == "placeholder_name"] <- col.name 

oder den Standardnamen verwenden, von "V1":

df <- data.frame(1:4) 
names(df)[names(df) == "V1"] <- col.name 

oder von Position zuweisen:

df <- data.frame(1:4) 
names(df)[1] <- col.name 

oder wenn Sie haben Eine Spalte ersetzt einfach das gesamte names Attribut:

df <- data.frame(1:4) 
names(df) <- col.name 

Es gibt auch die set_names Funktion im magrittr Paket, das Sie diese letzte Lösung verwenden kann in einem Schritt zu tun:

library(magrittr) 
df <- set_names(data.frame(1:4), col.name) 

Aber set_names ist nur ein Alias ​​für:

df <- `names<-`(data.frame(1:4), col.name) 

ist Teil von Base R. Es ist eine gute Übung herauszufinden, warum dieser Ausdruck funktioniert und einen Sinn ergibt.

+3

Auch gibt es die 'setNames' von' base R' – akrun

0

empfehle ich Ihnen das nicht tun, aber:

col.name <- 'col1' 
eval(parse(text=paste0('data.frame(', col.name, '=1:4)'))) 
+2

Dies ist in der Tat eine sehr schlechte Möglichkeit, es zu tun. Das Analysieren beliebiger Textwerte ist gefährlich und sollte vermieden werden. – MrFlick

+0

@MrFlick In der Tat. – Zach

3

Neben Antwort des ssdecontrol, gibt es eine zweite Option.

Sie suchen nach mget. Ordnen Sie zuerst der Variable den Namen und dann den Wert der Variablen zu, die Sie zuvor zugewiesen haben. Danach bewertet mget die Zeichenfolge und übergibt sie an data.frame.

assign(col.name, "col1") 
assign(paste(col.name), 1:4) 

df <- data.frame(mget(col.name)) 
print(df) 
    col1 
1 1 
2 2 
3 3 
4 4 
Verwandte Themen