以矢量化方式查找 R 矩阵单元
Look up R matrix cells in a vectorized way
我想通过使用数据框中的行和列来查找矩阵单元格。最好,我想以矢量化的方式执行此操作以获得最佳性能。然而,最明显的语法导致查找所有可能的行列组合,而不仅仅是源自一个数据框行的组合:
这是一个小例子:
> m1 <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), 3, 3)
>
> m1
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
>
> p1 <- data.frame(row = c(2, 3, 1), column = c(3, 1, 2))
>
> p1
row column
1 2 3
2 3 1
3 1 2
>
> # vectorized indexing that does not work as intended
> m1[p1$row, p1$column]
[,1] [,2] [,3]
[1,] 8 2 5
[2,] 9 3 6
[3,] 7 1 4
>
> # this works as intended, but is possible slow due to R-language looping
> sapply(1 : nrow(p1), function (i) { m1[p1[i, "row"], p1[i, "column"]] })
[1] 8 3 4
sapply
调用计算了我期望的输出(仅 m1[2, 3]
、m1[3, 1]
和 m1[1, 2]
),但对于较大的数据帧,它预计会很慢,因为它R语言中的循环。
有没有更好的(最好是矢量化的)方法?
为了您的预期目的,您需要使用矩阵来使用特定的行、列组合对矩阵进行子集化。所以你可以试试:
m1[as.matrix(p1)]
# [1] 8 3 4
或者如果你有两个向量:
m1[cbind(row_idx, col_idx)]
我想通过使用数据框中的行和列来查找矩阵单元格。最好,我想以矢量化的方式执行此操作以获得最佳性能。然而,最明显的语法导致查找所有可能的行列组合,而不仅仅是源自一个数据框行的组合:
这是一个小例子:
> m1 <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), 3, 3)
>
> m1
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
>
> p1 <- data.frame(row = c(2, 3, 1), column = c(3, 1, 2))
>
> p1
row column
1 2 3
2 3 1
3 1 2
>
> # vectorized indexing that does not work as intended
> m1[p1$row, p1$column]
[,1] [,2] [,3]
[1,] 8 2 5
[2,] 9 3 6
[3,] 7 1 4
>
> # this works as intended, but is possible slow due to R-language looping
> sapply(1 : nrow(p1), function (i) { m1[p1[i, "row"], p1[i, "column"]] })
[1] 8 3 4
sapply
调用计算了我期望的输出(仅 m1[2, 3]
、m1[3, 1]
和 m1[1, 2]
),但对于较大的数据帧,它预计会很慢,因为它R语言中的循环。
有没有更好的(最好是矢量化的)方法?
为了您的预期目的,您需要使用矩阵来使用特定的行、列组合对矩阵进行子集化。所以你可以试试:
m1[as.matrix(p1)]
# [1] 8 3 4
或者如果你有两个向量:
m1[cbind(row_idx, col_idx)]