Ottenere stringhe riconosciute come nomi di variabili in R

Correlati: stringhe come riferimenti variabili in R
Probabilmente correlato: concatena le espressioni per sottoporre a serie un dataframe


Ho semplificato la domanda per la richiesta di commento. Qui va con alcuni dati di esempio.

dat <- data.frame(num=1:10,sq=(1:10)^2,cu=(1:10)^3) set1 5) set2 <- subset(dat,num<=5) 

Ora, vorrei fare una trama di bolle da questi. Ho un set di dati più complicato con 3+ colors e sottoinsiemi complicati, ma faccio qualcosa del genere:

 symbols(set1$sq,set1$cu,circles=set1$num,bg="red") symbols(set2$sq,set2$cu,circles=set2$num,bg="blue",add=T) 

Mi piacerebbe fare un ciclo for come questo:

 colors <- c("red","blue") sets <- c("set1","set2") vars <- c("sq","cu","num") for (i in 1:length(sets)) { symbols(sets[[i]][,sq],sets[[i]][,cu],circles=sets[[i]][,num], bg=colors[[i]],add=T) } 

So che puoi avere una variabile valutata per specificare la colonna (come var="cu"; set1[,var] ; Voglio sapere come ottenere una variabile per specificare data.frame stesso (e un’altra per valutare la colonna) .


Aggiornamento: eseguito su questo post su r-blogger che ha questo esempio:

 x <- 42 eval(parse(text = "x")) [1] 42 

Sono in grado di fare qualcosa di simile ora:

 eval(parse(text=paste(set[[1]],"$",var1,sep=""))) 

Nel giocherellare con questo, trovo interessante che i seguenti non siano equivalenti:

 vars <- data.frame("var1","var2") eval(parse(text=paste(set[[1]],"$",var1,sep=""))) eval(parse(text=paste(set[[1]],"[,vars[[1]]]",sep=""))) 

In realtà devo fare questo:

 eval(parse(text=paste(set[[1]],"[,as.character(vars[[1]])]",sep=""))) 

Update2: Quanto sopra funziona per emettere valori … ma non nel tentativo di tracciare. Non posso fare:

 for (i in 1:length(set)) { symbols(eval(parse(text=paste(set[[i]],"$",var1,sep=""))), eval(parse(text=paste(set[[i]],"$",var2,sep=""))), circles=paste(set[[i]],".","circles",sep=""), fg="white",bg=colors[[i]],add=T) } 

Ottengo le invalid symbol coordinates . Ho controllato la class del set [[1]] ed è un fattore. Se faccio is.numeric(as.numeric(set[[1]])) ottengo TRUE . Anche se aggiungo quello sopra prima eval , ottengo ancora l’errore. Stranamente, però, posso farlo:

 set.xvars <- as.numeric(eval(parse(text=paste(set[[i]],"$",var1,sep="")))) set.yvars <- as.numeric(eval(parse(text=paste(set[[i]],"$",var2,sep="")))) symbols(xvars,yvars,circles=data$var3) 

Perché un comportamento diverso se memorizzato come variabile o eseguito all’interno della funzione di simbolo?

Hai trovato una risposta, cioè eval(parse()) . Puoi anche investigare su do.call() che è spesso più semplice da implementare. Tieni a mente anche lo strumento utile as.name() , per convertire stringhe in nomi di variabili.

La risposta di base alla domanda nel titolo è eval(as.symbol(variable_name_as_string)) usata da Josh O’Brien. per esempio

 var.name = "x" assign(var.name, 5) eval(as.symbol(var.name)) # outputs 5 

O più semplicemente:

 get(var.name) # 5 

Senza dati di esempio, è davvero difficile sapere esattamente cosa si desidera. Ad esempio, non riesco affatto a capire come si presenta il tuo object (o è sets ).

Detto questo, il seguente aiuto è del tutto?

 set1 <- data.frame(x = 4:6, y = 6:4, z = c(1, 3, 5)) plot(1:10, type="n") XX <- "set1" with(eval(as.symbol(XX)), symbols(x, y, circles = z, add=TRUE)) 

MODIFICA :

Ora che vedo il tuo vero compito, ecco un one-liner che farà tutto ciò che vuoi senza richiedere alcun ciclo for() :

 with(dat, symbols(sq, cu, circles = num, bg = c("red", "blue")[(num>5) + 1])) 

L'un bit di codice che può sembrare strano è il bit che specifica il colore di sfondo. Prova queste due linee per vedere come funziona:

 c(TRUE, FALSE) + 1 # [1] 2 1 c("red", "blue")[c(F, F, T, T) + 1] # [1] "red" "red" "blue" "blue" 

Se si desidera utilizzare una stringa come nome di variabile, è ansible utilizzare assegnare:

 var1="string_name" assign(var1, c(5,4,5,6,7)) string_name [1] 5 4 5 6 7 

Compilare i dati e riunirli non è necessario. Quindi sono loop poiché tali operazioni sono vettorializzate. Dalla tua modifica precedente, suppongo che tu stia facendo tutto questo per creare grafici a bolle. Se è corretto, forse l’esempio qui sotto ti aiuterà. Se questo è lontano, posso semplicemente cancellare la risposta.

 library(ggplot2) # let's look at the included dataset named trees. # ?trees for a description data(trees) ggplot(trees,aes(Height,Volume)) + geom_point(aes(size=Girth)) # Great, now how do we color the bubbles by groups? # For this example, I'll divide Volume into three groups: lo, med, high trees$set[trees$Volume<=22.7]="lo" trees$set[trees$Volume>22.7 & trees$Volume<=45.4]="med" trees$set[trees$Volume>45.4]="high" ggplot(trees,aes(Height,Volume,colour=set)) + geom_point(aes(size=Girth)) # Instead of just circles scaled by Girth, let's also change the symbol ggplot(trees,aes(Height,Volume,colour=set)) + geom_point(aes(size=Girth,pch=set)) # Now let's choose a specific symbol for each set. Full list of symbols at ?pch trees$symbol[trees$Volume<=22.7]=1 trees$symbol[trees$Volume>22.7 & trees$Volume<=45.4]=2 trees$symbol[trees$Volume>45.4]=3 ggplot(trees,aes(Height,Volume,colour=set)) + geom_point(aes(size=Girth,pch=symbol))