2011-10-27 162 views
6

我有11個不同長度的列表,導入到R中爲p1,p2,p3,...,p11。現在我想從所有列表中獲取rollmean(庫TTR),並將結果命名爲p1y,p2y,...,p11y。R:在循環中創建變量

這似乎是一個循環的工作,但我讀了這往往不是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'在動物園裏; TTR函數是'runMean'。 –

回答

7

正如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()) 
+0

+1,正在考慮用相同的方式寫答案,從環境中獲得清單,然後從環境中獲得清單,然後回到環境中。問題是我不知道這些有用的函數'mget'和'list2env'。 – 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) 
} 

馬虎的例子,但你明白了,我希望。

+0

這不是OP想要的...... –