0

Rでループ内にループを記述しようとしていますが、内側のループだけが機能しているようです:

test <- rbind(c(1:30), c(31:60), c(61:90), c(91:120))

これが私が書いたものです:

b<- data.frame()
n<-1
i<-1
c<- data.frame()

while(i<=4){
    while(n<=10) {
        a<-cbind(test[i, 3*n-2], test[i, 3*n-1], test[i,3*n])
        b<-rbind(b,a); n<-n+1
    } ; i<-i+1; c<-cbind(c,b)
}

基本的に私がやろうとしているのは、各行を 3 つの列でグループ化し、それを複数の行に変換してから、すべての行に対して実行し、これらの列をバインドすることです。

私の望ましい出力は次のようになります。

   1  2  3  31  32  33  61  62  63  81  82  83
   4  5  6  34  35  36  64  65  66  84  85  86
   7  8  9  37  38  39  67  68  69  ......
  10 11 12  40  41  42  ......
  13 14 15  43  45  46
  16 17 18 ......
  19 20 21
  22 23 24
  25 26 27
  28 29 30  58  59  60  78  79  80  118 119 120

しかし、私が書いたものは最初の行でしか機能せず、明らかに外側のループは機能しません。何が問題なのですか?

編集:forループに応じてさらに試したことは次のとおりです。

b<- data.frame()
c<- data.frame()
for(i in seq(from = 1, to = 4, by =1)){
    for( n in seq(from=1, to=10, by=1)) {
        a <- cbind(test[i, 3*n-2], test[i, 3*n-1], test[i,3*n])
        b <- rbind(b,a)
    }
        c <- cbind(c,b)
}

しかし、私はまだそれを機能させることができませんでした。どうしたの?

4

1 に答える 1

4

これであなたの人生は少し楽になるかもしれません...

out <- lapply( data.frame( t(test) ) , matrix , ncol = 3 , byrow = TRUE )
res <- do.call( cbind , out )
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
 [1,]    1    2    3   31   32   33   61   62   63    91    92    93
 [2,]    4    5    6   34   35   36   64   65   66    94    95    96
 [3,]    7    8    9   37   38   39   67   68   69    97    98    99
 [4,]   10   11   12   40   41   42   70   71   72   100   101   102
 [5,]   13   14   15   43   44   45   73   74   75   103   104   105
 [6,]   16   17   18   46   47   48   76   77   78   106   107   108
 [7,]   19   20   21   49   50   51   79   80   81   109   110   111
 [8,]   22   23   24   52   53   54   82   83   84   112   113   114
 [9,]   25   26   27   55   56   57   85   86   87   115   116   117
[10,]   28   29   30   58   59   60   88   89   90   118   119   120

おそらく、少しでも簡単に行うことができます...

do.call( cbind , lapply( 1:4 , function(x) matrix( test[x,] , ncol = 3 , byrow = F ) ) )

ループの使用を主張する場合、forこれがおそらく最も簡単な方法です...

out <- numeric()
for( i in 1:4 ){
  tmp <- matrix( test[ i , ] , ncol = 3 , byrow = TRUE )
  out <- cbind( out , tmp )
  }

この問題out <- data.frameは、結果データ構造を初期化するために を使用したことが原因でした。これは、行のないものから 10 行のものにしようとしていたことを意味しますcbinddata.frame不可能です (ただし、直感的にcbind10 行の空のベクターを作成するmatrixこともおそらく失敗するはずですが、そうではありません!)。

于 2013-08-15T19:52:53.150 に答える