gpt4 book ai didi

r - 使用包含行名和列名的索引向量向矩阵添加值

转载 作者:行者123 更新时间:2023-12-04 10:45:52 26 4
gpt4 key购买 nike

假设我有一个非常大的稀疏数据矩阵,但我只对查看它的样本感兴趣,使其更加稀疏。假设我还有一个三元组的数据框,包括数据的行/列/值的列(从 csv 文件导入)。我知道我可以使用 library(Matrix) 的 sparseMatrix() 函数来创建一个稀疏矩阵

sparseMatrix(i=df$row,j=df$column,x=df$value)

但是,由于我的值,我最终得到了一个数百万行乘以数万列的稀疏矩阵(其中大部分是空的,因为我的子集排除了大部分行和列)。所有这些零行和零列最终都会扭曲我的一些函数(以聚类为例——当原点甚至不是有效点时,我最终得到一个包含原点的集群)。
我想执行相同的操作,但使用 i 和 j 作为行名和列名。我尝试创建一个密集向量,采样到最大大小并使用添加值
denseMatrix <- matrix(0,nrows,ncols,dimnames=c(df$row,df$column))
denseMatrix[as.character(df$row),as.character(df$column)]=df$value

(实际上我一直将它设置为等于 1,因为我对这种情况下的值不感兴趣)但我发现它填充了整个矩阵,因为它需要所有行和列的交叉,而不仅仅是row1*col1, row2*col2...
有没有人知道一种方法来完成我想要做的事情?或者,我可以填充稀疏矩阵并简单地让它以某种方式丢弃所有零行和列以将自身压缩成更密集的形式(但我想保留一些对原始行号和列号的引用)
我很感激任何建议!

下面是一个例子:
> rows<-c(3,1,3,5)
> cols<-c(2,4,6,6)
> mtx<-sparseMatrix(i=rows,j=cols,x=1)
> mtx
5 x 6 sparse Matrix of class "dgCMatrix"

[1,] . . . 1 . .
[2,] . . . . . .
[3,] . 1 . . . 1
[4,] . . . . . .
[5,] . . . . . 1

我想去掉第 1,3 和 5 列以及第 2 行和第 4 行。这是一个非常简单的例子,但想象一下,如果不是第 1、3 和 5 行,而是 1000、3000 和 5000。然后它们之间会有更多的空行。这是我使用带有命名行/列的密集矩阵时发生的情况
> dmtx<-matrix(0,3,3,dimnames=list(c(1,3,5),c(2,4,6)))
> dmtx
2 4 6
1 0 0 0
3 0 0 0
5 0 0 0
> dmtx[as.character(rows),as.character(cols)]=1
> dmtx
2 4 6
1 1 1 1
3 1 1 1
5 1 1 1

最佳答案

当你说“摆脱”某些列/行时,你的意思是这样的:

> mtx[-c(2,4), -c(1,3,5)]
3 x 3 sparse Matrix of class "dgCMatrix"

[1,] . 1 .
[2,] 1 . 1
[3,] . . 1

子集设置有效,所以您只需要一种方法来找出哪些行和列是空的?如果这是正确的,那么您可以使用 colSums()rowSums()因为这些已经被 增强了矩阵包为稀疏矩阵提供适当的方法。这应该在操作过程中保持稀疏性
> dimnames(mtx) <- list(letters[1:5], LETTERS[1:6])
> mtx[which(rowSums(mtx) != 0), which(colSums(mtx) != 0)]
3 x 3 sparse Matrix of class "dgCMatrix"
B D F
a . 1 .
c 1 . 1
e . . 1

或者,也许更安全
> mtx[rowSums(mtx) != 0, colSums(mtx) != 0]
3 x 3 sparse Matrix of class "dgCMatrix"
B D F
a . 1 .
c 1 . 1
e . . 1

关于r - 使用包含行名和列名的索引向量向矩阵添加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7164430/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com