将行移动为r中的列

时间:2014-05-02 05:54:12

标签: r

有没有人知道可以执行以下操作的包/功能:

假设我有一个数据框:

1  2  3  4 
5  6  7  8
9  10 11 12
13 14 15 16

我想将其转换为:

1  2  3  4  5  6  7  8  9  10 11 12
5  6  7  8  9  10 11 12 13 14 15 16

由于

2 个答案:

答案 0 :(得分:1)

base包中有一些很好的功能可以帮助你完成这项工作。

> d <- read.table(header = FALSE, text = "1  2  3  4 
  5  6  7  8
  9  10 11 12
  13 14 15 16")

> d
##   V1 V2 V3 V4
## 1  1  2  3  4
## 2  5  6  7  8
## 3  9 10 11 12
## 4 13 14 15 16

> do.call(rbind, lapply(seq(nrow(d)-1, nrow(d)), function(i){
      cbind(d[i-2,], d[i-1,], d[i,])
      }))
##   V1 V2 V3 V4 V1 V2 V3 V4 V1 V2 V3 V4
## 1  1  2  3  4  5  6  7  8  9 10 11 12
## 2  5  6  7  8  9 10 11 12 13 14 15 16

ADD

更一般地说,我们可以获取三个连续行的子集,并将它们与以下内容绑定在一起。假设原始数据为x

> seqs <- lapply(seq(nrow(x)-2), function(i) seq(i, i+2))
> XX <- lapply(seq(seqs), function(i) x[seqs[[i]],])
> data.frame(t(sapply(XX, t)))

答案 1 :(得分:0)

不确定这是否正是您正在寻找的,但可能更简单的方法:

# Recreate the matrix
data=t(matrix(1:16,ncol=4))

#         [,1] [,2] [,3] [,4]
#    [1,]    1    2    3    4
#    [2,]    5    6    7    8
#    [3,]    9   10   11   12
#    [4,]   13   14   15   16

# Transform the matrix
newdata=matrix(t(data), nrow=2, byrow=T)

#           [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
#      [1,]    1    2    3    4    5    6    7    8
#      [2,]    9   10   11   12   13   14   15   16

这并没有返回你给出的确切转换,但也许它是一个更简单的起点。你能描述一下你更明确地寻找的模式吗?这可能有助于将该方法推广到任何 m x n 矩阵。