2016-07-18 10 views
-1

forループでデータフレームを作成および変更するには、cbindまたはrbindを使用するのに最適な、あるいは最も適切な方法は何でしょうか?最初の反復では、データフレームに列または行がないため、次の例ではcbindは機能しません。この最初のケースでは、forループの内側にif-else-commandが必要です。下にコードを書いているよりエレガントな方法はありませんか?ここでR:forループでデータフレームを初期化/作成する

mydat <- data.frame() 

for (j in 1:10) { 
    if (ncol(mydat) == 0) 
    mydat <- data.frame(sample(x = j * 5, size = 20, replace = T)) 
    else 
    mydat <- cbind(mydat, data.frame(sample(x = j * 5, size = 20, replace = T))) 
} 

colnames(mydat) <- sprintf("x%i", 1:10) 
+1

を使用して行列を変換するだけです。 data.frameを生成するためにループを使用しないでください。あなたの場合は、代わりに 'sapply'を使用することができます。 –

答えて

3

は、あなたがしたいdata.frameを生成するためのlapplydo.call(cbind, list)大会を結合するための簡単な方法です。

set.seed(1234) 
gendata <- function(x) { 
    sample(x = x*5, size = 20, replace = T) 
} 
do.call(cbind, lapply(1:10, gendata)) 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
# [1,] 1 4 9 18 24 2 27 21 20 24 
# [2,] 4 4 10 1 12 17 33 40 26 18 
# [3,] 4 2 5 7 4 9 35 13 20 31 
# [4,] 4 1 10 1 14 7 33 20 11  4 
# [5,] 5 3 5 5 5 5 18 15 4 48 
# [6,] 4 9 8 15 23 10 10 26 29  2 
# [7,] 1 6 11 7 10 5 9 30 20 43 
# [8,] 2 10 8 11 8 4 18 23 4 32 
# [9,] 4 9 4 2 5 14 18 40 37 16 
# [10,] 3 1 12 12 23 2 12 24 15 38 
# [11,] 4 5 2 3 5 22 34 18 35 32 
# [12,] 3 3 5 18 23 4 23 10 27 50 
# [13,] 2 4 11 1 4 29 5 4 32  7 
# [14,] 5 6 8 16 4 4 15 35 20 45 
# [15,] 2 2 3 2 3 7 33 10 16 41 
# [16,] 5 8 8 11 13 28 17 40 35 42 
# [17,] 2 3 8 8 8 29 32 25 20 42 
# [18,] 2 3 12 2 1 9 21 40 26 37 
# [19,] 1 10 3 7 8 4 23 16 6 50 
# [20,] 2 9 13 14 19 24 31 23 14 32 

EDIT:

としてはコンラッドルドルフ、Iは行列ないdata.frameた提供の結果により指摘されました。 as.data.frame

set.seed(1234) 
gendata <- function(x) { 
    sample(x = x*5, size = 20, replace = T) 
} 
dat <- as.data.frame(do.call(cbind, lapply(1:10, gendata))) 
names(dat) <- sprintf("x%i", 1:10) 
head(dat) 
# x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 
# 1 1 4 9 18 24 2 27 21 20 24 
# 2 4 4 10 1 12 17 33 40 26 18 
# 3 4 2 5 7 4 9 35 13 20 31 
# 4 4 1 10 1 14 7 33 20 11 4 
# 5 5 3 5 5 5 5 18 15 4 48 
# 6 4 9 8 15 23 10 10 26 29 2 
+0

これは 'data.frame'ではなく、行列を生成します。後者を得るには 'do.call(cbind.data.frame、...)'を使うことができますが、より良い方法は 'as.data.frame(...) 'を使うことです。いずれにしても、後で列名を設定する必要があります。 –

+0

@ KonradRudolphありがとうございます。私は編集します。 – dayne

+1

公平であるためには、OPが望むものがマトリックスになるかもしれません。私の解答は、 'sapply'を使って、質問のコメントに示唆されているように、data.frameではなく行列を作成しました。しかし、私の指摘は、 'data.frame'を作成するときに' do.call(cbind、...) 'ステップをまったく必要としないということでした。ベクトルのリストは直接(そしてはるかに効率的です) data.frame' - Rが行う必要があるのはクラス名です。 –

関連する問題