2011-10-27 15 views
6

Ho 11 elenchi di lunghezza diversa, importati in R come p1, p2, p3, ..., p11. Ora voglio ottenere il rollmean (libreria TTR) da tutte le liste e nominare il risultato p1y, p2y, ..., p11y.R: Crea variabili nel ciclo

Questo sembra essere il lavoro per un ciclo, ma ho letto che questo non è spesso buona pratica in R. Ho cercato qualcosa (sciocco) come

sample=10 
for (i in 1:11){ 
paste("p",i,"y",sep="")<-rollmean(paste("p",i,sep=""),sample) 
} 

che non funziona. Ho anche provato ad usarlo in combinazione con assign(), ma come ho capito assegnare può prendere solo una variabile e un singolo valore.

Come sempre mi colpisce che mi manca qualche funzione fondamentale di R.

+1

Dubito che tu abbia 11 "elenchi" (probabilmente hai 11 vettori). Se sono veramente 11 vettori, sarebbe più semplice metterli in una matrice, dato che 'rollmean' può funzionare per colonna. Non dovremmo indovinare se tu avessi fornito dati di esempio. Inoltre, 'rollmean' è nello zoo; la funzione TTR è 'runMean'. –

risposta

7

Come ha sottolineato Manuel, la tua vita sarà più facile se unisci le variabili in un elenco. Per questo, si desidera mget (abbreviazione di "get multiplo").

var_names <- paste("p", 1:11, sep = "") 
p_all <- mget(var_names, envir = globalenv()) 

Ora è sufficiente utilizzare lapply per chiamare rollmean su ogni elemento della vostra lista.

sample <- 10 
rolling_means <- lapply(p_all, rollmean, sample) 

(Inoltre, si consideri rinominando il sample a qualcosa che non sia già un nome di funzione.)

Suggerisco lasciando le risposte sotto forma di elenco, ma se vi piace l'idea di avere laminazione separata variabili medie per abbinare le variabili separate p1, p11 quindi utilizzare list2env.

names(rolling_means) <- paste(var_names, "y", sep = "") 
list2env(rolling_means, envir = globalenv()) 
+0

+1, stava pensando di scrivere risposta nelle stesse linee, ottenere la lista dall'ambiente, poi lapply, quindi tornare all'ambiente. Il problema era che non conoscevo queste utili funzioni 'mget' e' list2env'. – mpiktas

3

È possibile raggruppare le liste in uno e effettuare le seguenti operazioni

sample <- 10 
mylist <- list(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) 
for(i in 1:11) assign(paste('p',i,'y',sep=''), rollmean(mylist[i], sample)) 
1

Questo può essere fatto con ?get e ?do.call.

x1<-1:3 
x2 <- seq(3.5,5.5,1) 
for (i in 1:2) { 
sx<- (do.call("sin",list(c(get(paste('x',i,sep='',collapse='')))))) 
cat(sx) 
} 

Esempio sciatto, ma si ottiene l'idea, spero.

+0

Questo non è ciò che l'OP vuole ... –