我正在尝试在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)
}
但我仍然无法使其发挥作用。怎么了?
答案 0 :(得分: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
的空矢量应该也会失败,但它不会!)。