R:在循环中创建变量

时间:2011-10-27 10:13:31

标签: r

我有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 个答案:

答案 0 :(得分:8)

正如曼努埃尔指出的那样,如果将变量组合成一个列表,你的生活会更容易。为此,您需要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())

答案 1 :(得分:3)

您可以将列表分组为一个并执行以下操作

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))

答案 2 :(得分:1)

可以使用?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) 
} 

邋example的例子,但是你希望得到这个想法。