R 矩阵变换乐趣
我正在使用的矩阵如下所示R 矩阵变换乐趣,r,matrix,dataframe,R,Matrix,Dataframe,我正在使用的矩阵如下所示 m <- matrix(rep(c(0,1),10),ncol=2,nrow=5) colnames(m)<-c(2,5) 那么应该是 1 2 3 4 5 [1,] 0 0 0 0 1 [2,] 0 1 0 0 0 [3,] 0 0 0 0 1 [4,] 0 1 0 0 0 [5,] 0 0 0 0 1 该函数需要接受一个end参数(在本例中为5) 在非常大的矩阵中有一个快速的解吗?我讲的是1400乘以10
m <- matrix(rep(c(0,1),10),ncol=2,nrow=5)
colnames(m)<-c(2,5)
那么应该是
1 2 3 4 5
[1,] 0 0 0 0 1
[2,] 0 1 0 0 0
[3,] 0 0 0 0 1
[4,] 0 1 0 0 0
[5,] 0 0 0 0 1
该函数需要接受一个end参数(在本例中为5)
在非常大的矩阵中有一个快速的解吗?我讲的是1400乘以10 Mil的顺序,类似这样的东西,我们根据初始矩阵('m1')中列名的最大值创建一个0的正方形矩阵。在本例中,它是“5”。因此,我们创建的“m2”是维度
5X5
m <- matrix(rep(c(0,1),10),ncol=2,nrow=5)
colnames(m)<-c(2,5)
n <- max(as.numeric(colnames(m1)))
m2 <- matrix(0, n,n)
或者,
base R
选项将在不使用melt
的情况下创建行/列索引,cbind
行/列索引,并将“m2”中的值替换为1
library(reshape2)
m2[as.matrix(subset(melt(m1), value!=0)[,-3])] <- 1
m2
# [,1] [,2] [,3] [,4] [,5]
#[1,] 0 0 0 0 1
#[2,] 0 1 0 0 0
#[3,] 0 0 0 0 1
#[4,] 0 1 0 0 0
#[5,] 0 0 0 0 1
m2[cbind(seq(n), c(as.numeric(colnames(m1))[col(m1)]*m1))] <- 1
通过使用该数字索引,我们可以在转换为“numeric”后将该值更改为“m1”的列名。输出为向量
as.numeric(colnames(m1))[col(m1)]
#[1] 2 2 2 2 2 5 5 5 5 5
与“m1”相乘将“1”值替换为我们在上述步骤中得到的值
as.numeric(colnames(m1))[col(m1)]*m1
# 2 5
#[1,] 0 5
#[2,] 2 0
#[3,] 0 5
#[4,] 2 0
#[5,] 0 5
我们可以将(c
)它连接到vector
以创建列索引
c(as.numeric(colnames(m1))[col(m1)]*m1)
#[1] 0 2 0 2 0 5 0 5 0 5
cbind(seq(n), c(as.numeric(colnames(m1))[col(m1)]*m1))
# [,1] [,2]
#[1,] 1 0
#[2,] 2 2
#[3,] 3 0
#[4,] 4 2
#[5,] 5 0
#[6,] 1 5
#[7,] 2 0
#[8,] 3 5
#[9,] 4 0
#[10,] 5 5
获取“行”索引的“n”的seq
seq(n)
#[1] 1 2 3 4 5
当我们cbind
行索引和列索引时,由于循环,行索引会重复到列索引的长度
c(as.numeric(colnames(m1))[col(m1)]*m1)
#[1] 0 2 0 2 0 5 0 5 0 5
cbind(seq(n), c(as.numeric(colnames(m1))[col(m1)]*m1))
# [,1] [,2]
#[1,] 1 0
#[2,] 2 2
#[3,] 3 0
#[4,] 4 2
#[5,] 5 0
#[6,] 1 5
#[7,] 2 0
#[8,] 3 5
#[9,] 4 0
#[10,] 5 5
这可用于从“m2”中获取相应的元素
m2[cbind(seq(n), c(as.numeric(colnames(m1))[col(m1)]*m1))]
#[1] 0 0 0 0 0
我们将其分配给1
在编辑部分,我使用了!!m1
,它为所有非0的值返回逻辑矩阵TRUE/FALSE
。通过对m1[!!m1]
进行子集设置,我们得到了这些值的向量
,可以用于替换
或者更快的方法是使用
库(矩阵)
创建sparseMatrix
。如上所述,我们创建行('i')和列('j')索引,将'i'和'j'子集为仅包含非零值(因为它不适用于sparseMatrix
),并指定x=1
。在这里,我们不必创建初始矩阵“m2”
library(Matrix)
j <- c(as.numeric(colnames(m1))[col(m1)]*m1)
i <- rep(seq(n), length.out=length(j))
sparseMatrix(i[j!=0], j[j!=0], x=1)
# 5 x 5 sparse Matrix of class "dgCMatrix"
#[1,] . . . . 1
#[2,] . 1 . . .
#[3,] . . . . 1
#[4,] . 1 . . .
#[5,] . . . . 1
数据
m1这是一个类似的解决方案,不熔化基质
首先,我们将从最后一列中获取值并分配一个矩阵(类似于@akruns方法)
indx你能解释一下最后一点吗……为什么[,-3]?它在一般情况下有效还是仅在这个例子中有效?@kagh它应该在一般情况下有效。你能试试另一个例子吗?那么平方矩阵是1000列1000乘1000的情况?我只是认为,如果集合非常大,如q..a 10e6 t 10e6矩阵中所述,那么它就不起作用了。@kagh你能试试sparseMatrix
方法吗。应该是faster@akrun您的更新非常不同,因为您总是假设所有值都等于1,而我对data@kagh我们的“矩阵规模”是多少?怎么了?
as.matrix(sparseMatrix(i[j!=0], j[j!=0], x=1))
# [,1] [,2] [,3] [,4] [,5]
#[1,] 0 0 0 0 1
#[2,] 0 1 0 0 0
#[3,] 0 0 0 0 1
#[4,] 0 1 0 0 0
#[5,] 0 0 0 0 1
m1 <- matrix(rep(c(0,1),10),ncol=2,nrow=5)
colnames(m1) <- c(2,5)
indx <- as.numeric(colnames(m)[ncol(m)])
m2 <- matrix(0, ncol = indx, nrow = nrow(m))
colnames(m2) <- seq_len(indx)
m2[, colnames(m)] <- m
m2
# 1 2 3 4 5
# [1,] 0 0 0 0 1
# [2,] 0 1 0 0 0
# [3,] 0 0 0 0 1
# [4,] 0 1 0 0 0
# [5,] 0 0 0 0 1