R大矩阵算子

zc0qhyus  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(116)

我试图在一个大的.matrix对象中找到一个值的特定位置。取以下矩阵:

X <- as.big.matrix(matrix(1:30, 10, 3))

我想找到一个特定值出现的行号和列号,比如find_numb = 13(这将在后面用于另一个矩阵的子集)。在一个标准矩阵上,我做:

as.matrix(X) == find_numb #Convert big.matrix and find location of value

它返回一个TRUE/FALSE矩阵,这个矩阵很棒。
现在,当我在一个大的.matrix X == find_numb上做同样的事情时,我得到了以下错误:

Error in X == find_numb : 
  comparison (1) is possible only for atomic and list types

这似乎是一个简单的问题,但我不完全理解这个错误(仍然在学习R /编程),所以我为自己不理解这些原子和列表定义而道歉。
上面的例子是一个简单的例子:实际的矩阵大约是500 GB(因此是big.matrix),我想搜索不同数字的向量来找到它们各自的位置,例如:

find_numb <- sample(1:10000, 2000).

我起草了mcapply函数来做这件事,只是在试图找到每个值的初始位置时遇到了这个问题。
谢谢你的帮助和指导

h9a6wy2h

h9a6wy2h1#

使用R包{bigstatsr},您可以:

library(bigstatsr)
X <- as_FBM(matrix(sample(30, 5000, replace = TRUE), 50, 100))

# tuto for big_apply(): https://privefl.github.io/bigstatsr/articles/big-apply.html
test <- big_apply(X, function(X, ind) {
  res <- which(X[, ind, drop = FALSE] == 13, arr.ind = TRUE)
  res[, 2] <- ind[res[, 2]]
  res
}, a.combine = "rbind")

test2 <- which(X[] == 13, arr.ind = TRUE)
all.equal(test, test2)

免责声明:我是软件包的作者。

相关问题