2010-08-27 17 views
5

Mi piacerebbe creare una funzione che genera automaticamente analisi di regressione uni e multivariate, ma non sono in grado di capire come posso specificare ** variabili nei vettori ... ** Questo sembra molto facile, ma sfiorando la documentazione I havent capito finora ...vettore di nomi di variabili in R

facile esempio

a<-rnorm(100) 
b<-rnorm(100) 
k<-c("a","b") 
d<-c(a,b) 
summary(k[1]) 

ma k [1] = "a" ed è un vettore di carattere ... d è solo b aggiunto a a, non i nomi delle variabili. In effetti mi piacerebbe k [1] per rappresentare il vettore a.

Apprezziamo qualsiasi risposte ...

// M

risposta

10

È possibile utilizzare la funzione "get" per ottenere un oggetto in base a una stringa di caratteri del suo nome, ma a lungo andare è meglio per memorizzare le variabili in un elenco e basta accedervi in ​​questo modo, le cose diventano molto più semplici, puoi prendere sottoinsiemi, puoi usare lapply o sapply per eseguire lo stesso codice su ogni elemento. Quando si salva o si elimina si può lavorare sull'intero elenco piuttosto che cercare di ricordare ogni elemento. ad esempio:

mylist <- list(a=rnorm(100), b=rnorm(100)) 
names(mylist) 
summary(mylist[[1]]) 
# or 
summary(mylist[['a']]) 
# or 
summary(mylist$a) 
# or 
d <- 'a' 
summary(mylist[[d]]) 

# or 
lapply(mylist, summary) 

Se si programatically creazione di modelli per l'analisi con lm (o altre funzioni di modellazione), allora un approccio è quello sottoinsieme solo i dati e utilizzare il, ad esempio "":

yvar <- 'Sepal.Width' 
xvars <- c('Petal.Width','Sepal.Length') 
fit <- lm(Sepal.Width ~ ., data=iris[, c(yvar,xvars)]) 

oppure si può costruire la formula con "incolla" o "sprintf" quindi usare "as.formula" per convertirlo in una formula, ad esempio:

yvar <- 'Sepal.Width' 
xvars <- c('Petal.Width','Sepal.Length') 
my.formula <- paste(yvar, '~', paste(xvars, collapse=' + ')) 
my.formula <- as.formula(my.formula) 
fit <- lm(my.formula, data=iris) 

Nota anche il problema dei confronti multipli se si sta guardando uomo y diversi modelli si adattano automaticamente.

+0

Infatti, usare as.formula() è molto più pulito del costrutto eval() parse() che ho usato. –

+0

Questo sta anche migliorando ... Thx – Misha

+1

Un buon modo di pre-allocare una lista è via vettore ("lista", n) dove n è il numero di elementi che la lista deve contenere. Mi spiace essere un po 'fuori tema. :) –

3

è possibile utilizzare un elenco k=list(a,b). Questo crea una lista con i componenti a e b ma non è un elenco di nomi di variabili.

2

get() è quello che stai cercando:

summary(get(k[1])) 

edit: get() non è quello che stai cercando, è la lista(). anche get() potrebbe essere utile.

Se stai cercando la generazione automatica di analisi di regressione, potresti trarre vantaggio dall'utilizzo di eval(), anche se ogni programmatore R ti avviserà sull'uso di eval() a meno che tu non sappia molto bene cosa stai facendo. Leggere attentamente i file della guida su eval() e analizzare() prima di utilizzarli.

Un esempio:

d <- data.frame(
    var1 = rnorm(1000), 
    var2 = rpois(1000,4), 
    var3 = sample(letters[1:3],1000,replace=T) 
) 

vars <- names(d) 

auto.lm <- function(d,dep,indep){ 
     expr <- paste(
      "out <- lm(", 
      dep, 
      "~", 
      paste(indep,collapse="*"), 
      ",data=d)" 
    ) 
     eval(parse(text=expr)) 
     return(out) 
} 

auto.lm(d,vars[1],vars[2:3]) 
+0

Questo lo farà .. Thx un milione. Misha – Misha

+0

Prego. Ma in realtà Halpo ha ragione. Se vuoi che k [1] rappresenti il ​​vettore a, allora hai bisogno di una lista. Vale la pena esaminare anche. –

Problemi correlati