在R中快速交换矩阵索引和对应值的方法

3

我有一个20000x100的矩阵,存储了范围从1到40000的索引数字。我想将这些索引与它们对应的值进行交换。我在另一个数据表中存储索引-值对。由于这个过程需要很长时间,并且我需要用不同的值重复这个过程,因此我想学习最快的切换方式。

以下是一个可重现的示例(非常缓慢):

set.seed(42)
bigmatrix = matrix(round(runif(20, 1, 100)), ncol = 5)

# bigmatrix
#     [,1] [,2] [,3] [,4] [,5]
#[1,]   92   65   66   94   98
#[2,]   94   52   71   26   13
#[3,]   29   74   46   47   48
#[4,]   83   14   72   94   56


couples = data.frame(id = c(1:100),
                     val = runif(100))
# head(couples)
# id        val
# 1  1 0.90403139
# 2  2 0.13871017
# 3  3 0.98889173
# 4  4 0.94666823
# 5  5 0.08243756
# 6  6 0.51421178

for (i in c(1:nrow(bigmatrix))) {
    for (j in c(1:ncol(bigmatrix))) {
        bigmatrix[i, j] <- couples[couples$id == bigmatrix[i, j], ]$val
    }
} 

# bigmatrix

#          [,1]      [,2]         [,3]      [,4]      [,5]
# [1,] 0.8368016 0.7758234 0.5636468416 0.4527316 0.3556660
# [2,] 0.4527316 0.1404791 0.6674265147 0.9575766 0.3881083
# [3,] 0.9709666 0.9330341 0.1894739354 0.2712866 0.8281585
# [4,] 0.2165673 0.6851697 0.0002388966 0.4527316 0.7193558

编辑:我也可以安排情侣数据,使其成为一个数字列表,其中 list[index] = val ,但如果有一种无需任何循环即可完成的方法,那将是很棒的。


1
如果 couples$id == 1:nrow(couples),您可以跳过任何查找并进行直接索引:bigmatrix[] <- couples$val[bigmatrix] - jblood94
2个回答

2

尝试

matrix(
  couples$val[match(bigmatrix,couples$id)],
  nrow=nrow(bigmatrix)
)

          [,1]      [,2]         [,3]      [,4]      [,5]
[1,] 0.8368016 0.7758234 0.5636468416 0.4527316 0.3556660
[2,] 0.4527316 0.1404791 0.6674265147 0.9575766 0.3881083
[3,] 0.9709666 0.9330341 0.1894739354 0.2712866 0.8281585
[4,] 0.2165673 0.6851697 0.0002388966 0.4527316 0.7193558

谢谢。我之前是通过将夫妻对重新排列成一个值按ID排序的列表,然后访问创建一个由couples$val[c(bigmatrix)]组成的矩阵来完成的,但是你的解决方案让我免去了转换细节。而且它更加通用。非常感谢! - cccanhakan

1

这应该很快:

library(data.table)
setDT(couples, key = 'id')
bigmatrix[] <- couples[c(bigmatrix)]$val

#           [,1]      [,2]         [,3]      [,4]      [,5]
# [1,] 0.8368016 0.7758234 0.5636468416 0.4527316 0.3556660
# [2,] 0.4527316 0.1404791 0.6674265147 0.9575766 0.3881083
# [3,] 0.9709666 0.9330341 0.1894739354 0.2712866 0.8281585
# [4,] 0.2165673 0.6851697 0.0002388966 0.4527316 0.7193558

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接