2011-10-27 28 views
6

Tengo 11 listas de diferentes longitudes, importadas en R como p1, p2, p3, ..., p11. Ahora quiero obtener el rollmean (biblioteca TTR) de todas las listas y nombrar el resultado p1y, p2y, ..., p11y.R: Crear variables en el bucle

Este parece ser el trabajo para un bucle, pero he leído que a menudo no es una buena práctica en R. He intentado algo (tonta) como

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

que no funciona. También traté de usarlo en combinación con assign(), pero como entiendo, asignar solo puede tomar una variable y un único valor.

Como siempre se me ocurre que me falta alguna función fundamental de R.

+1

I ducho de que usted tenga 11 "listas" (es probable que tenga 11 vectores). Si realmente son 11 vectores, sería más fácil ponerlos en una matriz, ya que 'rollmean' puede operar por columna. No tendríamos que adivinar si tuviste datos de muestra proporcionados. Además, 'rollmean' está en el zoológico; la función TTR es 'runMean'. –

Respuesta

7

Como señaló Manuel, su vida será más fácil si combina las variables en una lista. Para esto, quiere mget (abreviatura de "obtención múltiple").

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

Ahora sólo tiene que utilizar lapply llamar rollmean en cada elemento de la lista.

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

(También, considere cambiar el nombre del sample a algo que no es ya un nombre de función.)

sugiero dejando las respuestas en forma de lista, pero si realmente te gusta la idea de tener rodadura las variables medias para hacer coincidir las variables separadas p1, p11 y luego usar list2env.

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

+1, estaba pensando en escribir la respuesta en la misma línea, obtener la lista del entorno, luego aplicarla, luego volver al entorno. El problema era que no conocía estas funciones útiles 'mget' y' list2env'. – mpiktas

3

podría agrupar sus listas en una sola y hacer lo siguiente

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

Esto se puede hacer con ?get y ?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) 
} 

Sloppy ejemplo, pero ya tienes la idea, espero.

+0

Eso no es lo que el OP quiere ... –