我有一个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
,但如果有一种无需任何循环即可完成的方法,那将是很棒的。
couples$id == 1:nrow(couples)
,您可以跳过任何查找并进行直接索引:bigmatrix[] <- couples$val[bigmatrix]
。 - jblood94