我有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的一些基本功能。
答案 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的例子,但是你希望得到这个想法。