2017-01-27 23 views
0
に書き込む

私は現在、「R for Data Science」の本を進めています。出力をデータフレームとしてforループをR

私はこの運動の問題(21.2.1 Q1.4)を解決しようとしていますが、forループを開始する前に正しい出力を判断できませんでした。 はμ= -10、0、10および100 I挿入しようとしている本の中で、前の質問のように

のそれぞれについて、10面のランダムな法線を生成します。へのforループ

書き込みAベクトル出力に変換しますが、この例では出力がデータフレームである必要がありますか?

これは、これまでの私のコードです:

values <- c(-10,0,10,100) 
output <- vector("double", 10) 

for (i in seq_along(values)) { 
    output[[i]] <- rnorm(10, mean = values[[i]]) 
} 

は、私は、出力が間違っている知っているが、私はここに必要な書式を作成する方法がわからないと思います。どんな助けでも大歓迎です。ありがとう!

+0

あなたは 'または' sapply'すなわち 'D1 akrun

+0

こんにちは、あなたのソリューションのおかげで。それは私が現在改良しようとしているスキルなので、forループ解を得ることは良いでしょう。ありがとう! – George

+0

空の行列またはリストを最初に作成し、その値を割り当てます。 'output < - vector(" list "、4)'; 'do.call(cbind、output) ' – akrun

答えて

2

これは学習上の問題ですから、私は解決方法を直接提供しません。

> values <- c(-10,0,10,100) 
> for (i in seq_along(values)) {print(i)} # Checking we iterate by position 
[1] 1 
[1] 2 
[1] 3 
[1] 4 
> output <- vector("double", 10) 
> output # Checking the place where the output will be 
[1] 0 0 0 0 0 0 0 0 0 0 
> for (i in seq_along(values)) { # Testing the full code 
+  output[[i]] <- rnorm(10, mean = values[[i]]) 
+ } 
Error in output[[i]] <- rnorm(10, mean = values[[i]]) : 
    more elements supplied than there are to replace 

エラーが各反復は10の乱数、(合計40)を生成し、あなただけの10個のスペースを持っている(置くために多くの要素がスペースよりもあると言う。することができますデータ・フォーマットを使用することを検討して見ることができるように反復ごとに複数の値を格納し だから:。

> output <- ?? 
> for (i in seq_along(values)) { # Testing the full code 
+  output[[i]] <- rnorm(10, mean = values[[i]]) 
+ } 
> output # Should have length 4 and each element all the 10 values you created in the loop 
+0

上記のakrunの答えを使用して、出力< - vector(" list "、4)を使用してコードと' cbind'または 'rbind'を使用してください。これはあなたがやることですか?関係する思考プロセスの徹底的な説明をありがとう!非常に役立ちます! – George

+0

はい、または単に 'output < - list()'を使用します。あなたはチックをクリックして最も役に立つと答えを選ぶことができますか?このようにして、問題は解決としてマークされます:D – Llopis

+0

ありがとう! – George

2

これにはさまざまな方法があります。ここに1つあります。インラインコメントを参照してください。

set.seed(357) # to make things reproducible, set random seed 

N <- 10 # number of loops 

xy <- vector("list", N) # create an empty list into which values are to be filled 

# run the loop N times and on each loop... 
for (i in 1:N) { 
    # generate a data.frame with 4 columns, and add a random number into each one 
    # random number depends on the mean specified 
    xy[[i]] <- data.frame(um10 = rnorm(1, mean = -10), 
         u0 = rnorm(1, mean = 0), 
         u10 = rnorm(1, mean = 10), 
         u100 = rnorm(1, mean = 100)) 
} 

# result is a list of data.frames with 1 row and 4 columns 

# you can bind them together into one data.frame using do.call 
# rbind means they will be merged row-wise 
xy <- do.call(rbind, xy) 

     um10   u0  u10  u100 
1 -11.241117 -0.5832050 10.394747 101.50421 
2 -9.233200 0.3174604 9.900024 100.22703 
3 -10.469015 0.4765213 9.088352 99.65822 
4 -9.453259 -0.3272080 10.041090 99.72397 
5 -10.593497 0.1764618 10.505760 101.00852 
6 -10.935463 0.3845648 9.981747 100.05564 
7 -11.447720 0.8477938 9.726617 99.12918 
8 -11.373889 -0.3550321 9.806823 99.52711 
9 -7.950092 0.5711058 10.162878 101.38218 
10 -9.408727 0.5885065 9.471274 100.69328 

もう1つの方法は、行列を事前に割り当て、値を追加してdata.frameに強制することです。

0
# set the number of rows 
rows <- 10 

# vector with the values 
means <- c(-10,0,10,100) 

# generating output matrix 
output <- matrix(nrow = rows, 
      ncol = 4) 

# setting seed and looping through the number of rows 
set.seed(222) 
for (i in 1:rows){ 
    output[i,] <- rnorm(length(means), 
        mean=means) 
} 

#printing the output 
output 
関連する問題