Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 矩阵变换乐趣_R_Matrix_Dataframe - Fatal编程技术网

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