在循环中创建变量

9
我有11个不同长度的列表,作为p1、p2、p3…… p11导入R。现在我想从所有列表中得到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的基本函数。


1
我怀疑您有11个“列表”(您可能有11个向量)。 如果它们确实是11个向量,将它们放入矩阵中最容易,因为 rollmean 可以按列操作。 如果您提供了样本数据,我们就不必猜测了。 此外, rollmean 在zoo中; TTR函数是 runMean - Joshua Ulrich
可能会尝试使用mapply或dplyr。 - Mox
3个回答

8
正如Manuel所指出的那样,如果将变量合并到一个列表中,您的生活会更加轻松。为此,您需要使用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,我也在考虑用同样的方式来回答问题,从环境中获取列表,然后使用lapply函数,最后再将结果返回到环境中。问题是我不知道这些有用的函数mgetlist2env - mpiktas

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

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

这只是一个简单的例子,但我希望你能理解。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接