矩阵中每列的单独移位

时间:2018-02-24 22:13:29

标签: r

我寻找一个转换矩阵的R代码如下(a:原始矩阵,b:所需的输出),例如:

a <- matrix(c(1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6), nrow = 6, ncol = 4)    
b <- matrix(c(1,2,3,4,5,6,2,3,4,5,6,0,3,4,5,6,0,0,4,5,6,0,0,0), nrow = 6, ncol = 4)

a
     [,1] [,2] [,3] [,4]
[1,]    1    1    1    1
[2,]    2    2    2    2
[3,]    3    3    3    3
[4,]    4    4    4    4
[5,]    5    5    5    5
[6,]    6    6    6    6

b
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    2    3    4    5
[3,]    3    4    5    6
[4,]    4    5    6    0
[5,]    5    6    0    0
[6,]    6    0    0    0 

因此,第一列不移位,第二列向上移动一步,第三列向上移动两步,依此类推。移位的列用零填充。

以下链接对我没有帮助(也不是:双循环,具有不同变量的函数,代码diag或kronecker)。

R: Shift values in single column of dataframe UP

r matrix individual shift operations of elements

Rotate a Matrix in R

你有什么想法吗?感谢。

4 个答案:

答案 0 :(得分:0)

我使用sapply的原始解决方案。您在sapply的每次迭代中移动列,然后sapply连接所有输出,您可以使用良好的大小(初始矩阵的大小)将其输入矩阵

matrix(sapply(1:dim(a)[2], function(x){c(a[x:dim(a)[1], x], rep(0, (x - 1) ))}), ncol = dim(a)[2], nrow = dim(a)[1])

     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    2    3    4    5
[3,]    3    4    5    6
[4,]    4    5    6    0
[5,]    5    6    0    0
[6,]    6    0    0    0

答案 1 :(得分:0)

这似乎适用于data.table。应该用大矩阵表现良好:

library(data.table)

# One way
dt[, shift(.SD, 0:3, 0, "lead", FALSE), .SDcols = 1]

# Alternatively
dt[, shift(dt, 0:3, 0, "lead", FALSE)][, 1:4]

两者都返回:

   V1 V2 V3 V4
1:  1  2  3  4
2:  2  3  4  5
3:  3  4  5  6
4:  4  5  6  0
5:  5  6  0  0
6:  6  0  0  0

使用以下数据:

a <- matrix(c(1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6), nrow = 6, ncol = 4)

dt <- setDT(as.data.frame(a))

答案 2 :(得分:0)

您可以通过填充矩阵来移动列,该矩阵的行超过“a”,其值为“a”(在回收期间生成警告)。选择原始行数。用零替换右下角的三角形。

nr <- nrow(a)
a2 <- matrix(a, ncol = ncol(a), nrow = nr + 1)[1:nr, ]

a2[col(a2) + row(a2) > nr + 1] <- 0
a2
#      [,1] [,2] [,3] [,4]
# [1,]    1    2    3    4
# [2,]    2    3    4    5
# [3,]    3    4    5    6
# [4,]    4    5    6    0
# [5,]    5    6    0    0
# [6,]    6    0    0    0

答案 3 :(得分:0)

基于对我几乎有用的tyluRp的答案,我建议遍历所有列并分别在每个列上调用name: # Name of the Catalog Entry description: | # Description of the Catalog Entry version: # Version of the Catalog to be used category: # Category to be used for searching catalog entries maintainer: # The maintainer of the catalog entry license: # The license projectURL: # A URL related to the catalog entry 。让我们从这里的随机数矩阵开始:

version:

现在执行任务的循环...

shift

...通过用转换后的版本替换列。

原始答案将所有列替换为移位的第一列副本,从而丢失了数据。这可能是由于a <- matrix(floor(10*runif(24)), ncol=4) a [,1] [,2] [,3] [,4] [1,] 8 4 8 3 [2,] 0 6 9 0 [3,] 1 6 0 7 [4,] 0 3 9 7 [5,] 2 4 2 9 [6,] 4 8 5 6 library(data.table) dt <- setDT(as.data.frame(a)) 的组行为。