在列之后转换行

时间:2014-01-30 16:11:29

标签: r

我有csv文件,其内容如下

1        5
2        3
3        2  
4        6 
5        3
6        7
7        2 
8        1
9        1

我想做的是:

1       5      4       6     7      2
2       3      5       3     8      1
3       2      6       7     9      1

,即在每第三行之后,我想并排显示不同的值列。有什么建议吗?

非常感谢

2 个答案:

答案 0 :(得分:1)

这是使用矩阵索引执行此操作的方法。这有点奇怪,但我发现它很有趣所以我会发布它。

您需要一个索引矩阵,索引如下。这会将数据的顺序作为矩阵(列主要顺序):

1, 1
2, 1
3, 1
1, 2
2, 2
3, 2
4, 1

...

8, 2
9, 2

这给出了选择元素所需的模式。这是构建这种矩阵的一种方法。假设您的数据位于对象dat中,即数据框或矩阵:

m <- matrix(
        c(
           outer(rep(1:3, 2), seq(0,nrow(dat)-1,by=3), FUN='+'), 
           rep(rep(1:2, each=3), nrow(dat)/3)
        ),
        ncol=2
     )

outer表达式是所需索引矩阵的第一列,rep表达式是第二列。现在只需使用此索引矩阵索引dat,并构建一个包含三行的结果矩阵:

matrix(dat[m], nrow=3)
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    5    4    6    7    2
## [2,]    2    3    5    3    8    1
## [3,]    3    2    6    7    9    1

答案 1 :(得分:0)

a <- read.table(text = "1        5
 2        3
 3        2  
 4        6 
 5        3
 6        7
 7        2 
 8        1
 9        1")

(seq_len(nrow(a))-1) %/% 3
# [1] 0 0 0 1 1 1 2 2 2

split(a, (seq_len(nrow(a))-1) %/% 3)
# $`0`
  # V1 V2
# 1  1  5
# 2  2  3
# 3  3  2

# $`1`
  # V1 V2
# 4  4  6
# 5  5  3
# 6  6  7

# $`2`
  # V1 V2
# 7  7  2
# 8  8  1
# 9  9  1

do.call(cbind,split(a, (seq_len(nrow(a))-1) %/% 3))
#   0.V1 0.V2 1.V1 1.V2 2.V1 2.V2
# 1    1    5    4    6    7    2
# 2    2    3    5    3    8    1
# 3    3    2    6    7    9    1