2013-03-07 27 views
8

Sto pulendo un set di dati e devo scegliere le variabili in base a un'altra variabile. Diciamo che se ID = 1, ho bisogno di introdurre nel frame di dati la variabile VAR01, se ID = 2, ho bisogno di VAR02 e così via.Stringa con nome variabile in R

Così, sto facendo un ciclo for in cui incollo il nome della variabile 'VAR' con il numero ID con la funzione stringf. Il problema è che ho bisogno di R per capire la stringa come nome di una funzione.

ho trovato nel forum di questa soluzione, che non funziona per me:

> variable1 = c("monday", "tuesday", "wednesday") 

> var_name = "variable1" 

> eval(parse(text=var_name)) 
[1] "monday" "tuesday" "wednesday" 

Il problema è che non posso usarlo per fare riferimento alla variabile:

> eval(parse(text=var_name)) = c(1,2,3) 
Error in file(filename, "r") : cannot open the connection 
In addition: Warning message: 
In file(filename, "r") : 
cannot open file 'variable1': No such file or directory 

Ha qualcuno ha una soluzione?

Grazie!

+0

Puoi provare a dare un esempio di quali sono i tuoi dati e l'output desiderato? – alexwhan

risposta

5

È possibile utilizzare get:

result = get(var_name) 

Sebbene l'uso pesante di get e set suggerisce si potrebbe desiderare di iniziare a utilizzare list 's di variabili, invece:

l = list(variable1 = c(1,2,3)) 
l$variable1 = c(4,5,6) 
+0

Penso che voglia assegnare 1, 2, 3 a lunedì, martedì e mercoledì rispettivamente ..? non sono sicuro, se ho capito bene però. – Arun

+0

Questo è esattamente ciò che dice il titolo e in questo caso l'OP dovrebbe utilizzare gli elenchi. –

9

È possibile utilizzare assign()

var_name <- 'test' 
assign(var_name,1:3) 
test 

Nota: assign come tale creerà la variabile nell'ambiente in cui è chiamata. Quindi, se si dovesse chiamare assign all'interno di una funzione come questa:

myfun <- function(var) { 
    assign(eval(substitute(var)), 5) 
    print(get(var)) 
} 

Chiamando la funzione assegna my_var un valore pari a 5 all'interno della funzione, il cui ambiente è stato creato solo per il tempo della funzione viene eseguito e distrutto dopo.

> myfun("my_var") 
# [1] 5 

> my_var 
# Error: object 'my_var' not found 

Quindi, se si vuole mantenere il valore dopo una chiamata di funzione, quindi, si dovrà specificare un ambiente avrete la variabile thro' la volta che si esegue il vostro compito. Ad esempio, nel global environment:

myfun <- function(var, env = globalenv()) { 
    assign(eval(substitute(var)), 5, envir = env) 
    print(get(var)) 
} 

> myfun("my_var") 
# [1] 5 
> my_var 
# [1] 5 
+2

La funzione 'assign' non può essere facilmente assegnata a un frame di dati (come menzionato nella prima parte della domanda). Vedi anche 'fortune (236)'. –

2

Questo è FAQ 7.21.

La parte più importante di queste FAQ è il punto in cui indica di utilizzare gli elenchi invece di farlo nell'ambiente globale. Hai detto che vuoi farlo in un frame di dati (che è già una lista), quindi questo diventa più semplice. Provare qualcosa di simile:

mydf <- data.frame(g=c('a','b','c')) 
ID <- 1 

mydf[[ sprintf("VAR%02d",ID) ]] <- 1:3 
mydf 

Utilizzando eval(parse(text=...)) in questo caso è come dire che si sa come andare da New York a Boston e quindi chiedere indicazioni dalla vostra origine a New York e indicazioni da Boston a destinazione. In alcuni casi, questo potrebbe non essere troppo male, ma è un po 'fuori mano se stai cercando di andare da Londra a Parigi (e il tuo esempio ti ha portato da New York a Boston passando per Marte). Vedi fortune(106).

+0

+1 per [fortune (106)] (http://cran.r-project.org/web/packages/fortunes/vignettes/fortunes.pdf): Se la risposta è parse(), di solito dovresti ripensare alla domanda. -Thomas Lumley - R-help (febbraio 2005) – zx8754

Problemi correlati