R: Создать переменные в цикле - PullRequest
7 голосов
/ 27 октября 2011

У меня есть 11 списков разной длины, импортированных в R как p1, p2, p3, ..., p11.Теперь я хочу получить rollmean (библиотека TTR) из всех списков и назвать результат p1y, p2y, ..., p11y.

Похоже, это работа для цикла, но я читал, что в R. это часто не очень хорошая практика. Я попробовал что-то (глупое), например,

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

, которое не работает.Я также пытался использовать его в сочетании с assign (), но, как я понимаю, assign может принимать только переменную и одно значение.

Как всегда, мне кажется, что мне не хватает какой-то фундаментальной функции R.

Ответы [ 3 ]

8 голосов
/ 27 октября 2011

Как указал Мануэль, ваша жизнь станет проще, если вы объедините переменные в список.Для этого вам нужно mget (сокращение от «множественное получение»).

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

Теперь просто используйте lapply для вызова rollmean для каждого элемента вашего списка.

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

(Кроме того, рассмотрите возможность переименования sample во что-то, что еще не является именем функции.)

Я предлагаю оставить ответы в виде списка, но если вам действительно нравится идея иметь отдельный переходсредние переменные для соответствия отдельным переменным p1, p11, затем используйте list2env.

names(rolling_means) <- paste(var_names, "y", sep = "")
list2env(rolling_means, envir = globalenv())
3 голосов
/ 27 октября 2011

Вы можете сгруппировать свои списки в один и сделать следующее

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 голос
/ 27 октября 2011

Это можно сделать с помощью ?get и ?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) 
} 

Небрежный пример, но я надеюсь, вы поняли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...