将列移动一个

时间:2014-07-14 14:31:35

标签: r matrix

我想将矩阵中的列向右移动一次。

Input <- data.frame(read.csv2 ....)

矩阵看起来像:

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

应该像:

4   1   2   3
4   1   2   3 
4   1   2   3
我用谷歌搜索了但我找不到任何东西。

感谢您的帮助!!!

这看起来很不错Moving columns within a data.frame() without retyping

1 个答案:

答案 0 :(得分:0)

虽然评论中的答案适用于向右移动的一列,但它很难将这种方法扩展到其他班次和方向。

归结为生成要返回的列顺序的向量,然后对列进行子集化。

所以你原来的Q归结为生成c(4,1,2,3)magic包中有一个方便的功能可以执行此操作:

> install.packages("magic") # if you dont have it
> magic::shift(1:4,1)
[1] 4 1 2 3

所以:

> Data[,magic::shift(1:ncol(Data),1)]
     [,1] [,2] [,3] [,4]
[1,]   13    1    5    9
[2,]   14    2    6   10
[3,]   15    3    7   11
[4,]   16    4    8   12

回答你原来的问题。然后,这很容易延伸到多个班次或负向(向左)班次:

> Data[,magic::shift(1:ncol(Data),-2)]
     [,1] [,2] [,3] [,4]
[1,]    9   13    1    5
[2,]   10   14    2    6
[3,]   11   15    3    7
[4,]   12   16    4    8

当然正确的方法是创建矩阵移位功能:

> mshift = function(m,n=1){m[,magic::shift(1:ncol(m),n)]}

你可以检查:

> mshift(Data,1)
     [,1] [,2] [,3] [,4]
[1,]   13    1    5    9
[2,]   14    2    6   10
[3,]   15    3    7   11
[4,]   16    4    8   12