2013-10-08 34 views
2

我正在一個項目中,我必須做很多重複和生活會更容易,如果我可以解決for循環中的多個對象。爲了elleborate我的問題我已經想出了一個(傻)例如爲循環對象名稱迭代

舉例來說,如果這樣做,以創建我的數據:

for (i in 1:10) 
    { 
assign(paste("Season",i, sep = ""),rnorm(10,0,1)) 
} 

所以我有第1季,Season2,..,Season10。 是否可以使用for循環將10個對象的第一個數字更改爲零。半僞代碼看起來像這樣。但當然這不起作用。

for (i in 1:10) 
    { 
Seasoni[1]<-0 
} 

任何人都有解決方案嗎?

斯特凡

+3

解決的辦法是不要保存您在不同的對象中的數據叫第1季,Season2等,但要把他們全部列入清單。然後你可以使用像lapply這樣的工具將它們作爲一個整體進行操作。 – joran

回答

8

直接解決你的問題是使用getpaste

for(i in 1:10) 
{ 
    Object = get(paste0("Season", i)) 
    Object[1] = 0 
    assign(paste0("Season", i), Object) 
} 

但不這樣做

這是一個可怕的使用R的作爲在評論中建議,將結果存儲在列表:

Seasons = lapply(rep(10,10), rnorm) #Generate data 
Seasons 

然後應用功能:

Seasons = lapply(Seasons, replace, list=1, values=0) 
0

這裏的基礎上@ joran的評論

的解決方案
> set.seed(1) # for reproducibility 
> # the following does the same as your `for` loop and returned value is a list 
> Season.list <- replicate(10, rnorm(10, 0, 1), simplify=FALSE) 
> # giving some names 
> names(Season.list) <- paste0("Season", 1:length(Season.list)) 
> # setting first element to 1  
> Season.list <- lapply(Season.list, function(x) {x[1] <- 0; x}) 
> list2env(Season.list, envir = .GlobalEnv) # will give you each `Season` as you want :D 

另外,另一種方法,

> set.seed(1) 
> Season <- replicate(10, rnorm(10, 0, 1)) # the returned object is a matrix 
> colnames(Season) <- paste0("Season", 1:ncol(Season)) 
> Season[1,] <- 0 

如果你想有一個向量每個Season然後使用attach(不是一個好主意)

> attach(as.data.frame(Season)) 
> Season1 
[1] 0.0000000 0.1836433 -0.8356286 1.5952808 0.3295078 -0.8204684 0.4874291 0.7383247 0.5757814 -0.3053884 
> Season2 
[1] 0.00000000 0.38984324 -0.62124058 -2.21469989 1.12493092 -0.04493361 -0.01619026 0.94383621 0.82122120 
[10] 0.59390132