在 R 中填充矩阵
Fill matrix in R
我在 R 中有一个预分配的矩阵,需要用以下格式的文件生成的数据帧中的数据填充它:
1-1-7
1-3-2
2-2-6
1-4-8
....
其中第一列包含行索引,第二列包含列索引,第三列包含值。
有没有faster/better方式然后下面的循环?
for(i in 1:nrow(file)){
matrix[file[i,1],file[i,2]]=file[i,3]
}
使用 row/col
索引作为 file
的第一列和第二列,并使用这些索引将 file[,3]
分配给 m1
。
m1[as.matrix(file[1:2])] <- file[,3]
m1
# [,1] [,2] [,3] [,4]
#[1,] 7 0 2 8
#[2,] 0 6 0 0
正如我上面提到的,我们根据 row/column 索引分配值。如果我们将前两列转换为矩阵,第一列作为行索引,第二列作为列索引
as.matrix(file[1:2])
# v1 v2
#[1,] 1 1
#[2,] 1 3
#[3,] 2 2
#[4,] 1 4
如果我们根据第一行对 m1
进行子集化,即 1 1
,我们将在行=1 和列=1 处获取 m1
的元素,对于第二行也类似row,它将是 row=1 和 column=3 处的元素,依此类推。这里,我们创建了一个具有指定维度的 0
矩阵。因此,基于 row/columns 个位置的 4 个值将是 0
m1[as.matrix(file[1:2])]
#[1] 0 0 0 0
现在,我们通过将值分配给 'file'
的第 3 列来 changing/replacing 指定 row/column 位置的值 'm1'
m1[as.matrix(file[1:2])] <- file[,3]
如果我们检查指定位置的值,它将被替换
m1[as.matrix(file[1:2])]
#[1] 7 2 6 8
或者我们可以使用另一种方法,使用 library(Matrix)
中的 sparseMatrix
library(Matrix)
sM <- sparseMatrix(file[,1], file[,2], x=file[,3])
as.matrix(sM)
# [,1] [,2] [,3] [,4]
#[1,] 7 0 2 8
#[2,] 0 6 0 0
数据
file <- structure(list(v1 = c(1L, 1L, 2L, 1L), v2 = c(1L, 3L, 2L, 4L),
v3 = c(7, 2, 6, 8)), .Names = c("v1", "v2", "v3"),
class = "data.frame", row.names = c(NA, -4L))
m1 <- matrix(0, nrow=max(file[,1]), ncol=max(file[,2]))
我在 R 中有一个预分配的矩阵,需要用以下格式的文件生成的数据帧中的数据填充它:
1-1-7
1-3-2
2-2-6
1-4-8
....
其中第一列包含行索引,第二列包含列索引,第三列包含值。
有没有faster/better方式然后下面的循环?
for(i in 1:nrow(file)){
matrix[file[i,1],file[i,2]]=file[i,3]
}
使用 row/col
索引作为 file
的第一列和第二列,并使用这些索引将 file[,3]
分配给 m1
。
m1[as.matrix(file[1:2])] <- file[,3]
m1
# [,1] [,2] [,3] [,4]
#[1,] 7 0 2 8
#[2,] 0 6 0 0
正如我上面提到的,我们根据 row/column 索引分配值。如果我们将前两列转换为矩阵,第一列作为行索引,第二列作为列索引
as.matrix(file[1:2])
# v1 v2
#[1,] 1 1
#[2,] 1 3
#[3,] 2 2
#[4,] 1 4
如果我们根据第一行对 m1
进行子集化,即 1 1
,我们将在行=1 和列=1 处获取 m1
的元素,对于第二行也类似row,它将是 row=1 和 column=3 处的元素,依此类推。这里,我们创建了一个具有指定维度的 0
矩阵。因此,基于 row/columns 个位置的 4 个值将是 0
m1[as.matrix(file[1:2])]
#[1] 0 0 0 0
现在,我们通过将值分配给 'file'
的第 3 列来 changing/replacing 指定 row/column 位置的值 'm1' m1[as.matrix(file[1:2])] <- file[,3]
如果我们检查指定位置的值,它将被替换
m1[as.matrix(file[1:2])]
#[1] 7 2 6 8
或者我们可以使用另一种方法,使用 library(Matrix)
sparseMatrix
library(Matrix)
sM <- sparseMatrix(file[,1], file[,2], x=file[,3])
as.matrix(sM)
# [,1] [,2] [,3] [,4]
#[1,] 7 0 2 8
#[2,] 0 6 0 0
数据
file <- structure(list(v1 = c(1L, 1L, 2L, 1L), v2 = c(1L, 3L, 2L, 4L),
v3 = c(7, 2, 6, 8)), .Names = c("v1", "v2", "v3"),
class = "data.frame", row.names = c(NA, -4L))
m1 <- matrix(0, nrow=max(file[,1]), ncol=max(file[,2]))