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)
}

基本上我要做的是将每行按三列分组并将其转换为多行,然后对每一行执行并绑定这些列。

我想要的输出如下所示:

   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初始化结果数据结构。这意味着你试图cbind一个data.frame没有行到一个有 10 行。不可能(尽管直观地能够cbind使用 10 行的空向量matrix也可能会失败,但它不会!)。

于 2013-08-15T19:52:53.150 回答