6

私は多くの繰り返しを行う必要があるプロジェクトに取り組んでおり、for ループで複数のオブジェクトに対処できれば、生活はずっと楽になります。私の質問を詳しく説明するために、(ばかげた)例を思いつきました

たとえば、これを行ってデータを作成した場合:

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

つまり、シーズン 1、シーズン 2、..、シーズン 10 があります。for loop を使用して、10 個のオブジェクトの最初の数をゼロに変更することは可能ですか? セミ擬似コードはこんな感じ。しかし、もちろんこれはうまくいきません。

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

解決策を持っている人はいますか?

ステファン

4

2 に答える 2

18

あなたの質問に対する直接的な解決策は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)
于 2013-10-08T18:35:25.753 に答える
2

これは@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
于 2013-10-08T18:38:46.287 に答える