2015-05-06 15 views
10

C'è un modo per utilizzare la stringa memorizzata nella variabile come nome di colonna in un nuovo frame di dati? Il risultato atteso dovrebbe essere:Variabile come nome di colonna nel frame di dati

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 

Mi rendo conto che posso creare frame di dati e quindi utilizzare nomi() per rinominare colonna o utilizzare df [,] col.name per oggetto esistente, ma Mi piacerebbe sapere se c'è qualche altra soluzione che potrebbe essere utilizzata durante la creazione di frame di dati.

+1

'data.frame (col1 = 1: 4)' vi darà il "risultato atteso" – Jeff

+3

@Jeff ma vuole passare ' "col1"' da una variabile – shadowtalker

+0

A proposito, ho ha segnalato questa domanda per essere spostata su Stack Overflow, poiché riguarda la programmazione in R e non le statistiche. – shadowtalker

risposta

14

Non è possibile passare una variabile nel nome di un argomento del genere.

Invece quello che si può fare è:

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

o utilizzare il nome predefinito di "V1":

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

o assegnare in base alla posizione:

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

o se avete solo una colonna sostituisce semplicemente l'intero attributo names:

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

C'è anche la funzione set_names nel pacchetto magrittr che è possibile utilizzare per fare questa ultima soluzione in un solo passo:

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

Ma set_names è solo un alias per:

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

che fa parte della base R. Capire perché questa espressione funziona e ha senso sarà un buon esercizio.

+3

Inoltre, vi è il 'setNames' da' base R' – akrun

0

Non consiglio di fare questo, ma:

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

Questo è davvero un modo molto brutto per farlo. L'analisi di valori di testo arbitrari è pericolosa e dovrebbe essere evitata. – MrFlick

+0

@MrFlick Effettivamente. – Zach

3

Oltre alla risposta di ssdecontrol, c'è una seconda opzione.

Stai cercando mget. Assegna prima il nome alla variabile, quindi il valore alla variabile che hai precedentemente assegnato. Successivamente, mget valuterà la stringa e la passerà a 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 
Problemi correlati