我寻找一个转换矩阵的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
你有什么想法吗?感谢。
答案 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))
的组行为。