通过行名和列名访问矩阵,如果不可用,return 为零
access matrix by rownames and colnames, and return zero if not available
我有一个包含行名和列名的矩阵:
a = matrix(1:4,2,2)
dimnames(a) = list(c("x","y"),c("x","y"))
我可以通过行名和列名访问矩阵元素,例如,
a["x","y"]
当我键入 a["x","z"] 时,它给我一个错误“a["x", "z"] 中的错误:下标越界",这应该是。
我的问题是如何得到零而不是那个错误。更准确地说,当我输入不在行名(a)或列名(a)中的错误行名或列名时,它 returns 一个固定值,例如零。例如,零表示 a["x","z"], a["z","t"], ...
我们可以用 purrr
中的 tryCatch
或 possibly
包装来实现这一点
library(purrr)
f1 <- possibly(function(mat, indx1, indx2) mat[indx1, indx2], otherwise = 0)
f1(a, 'x', 'z')
#[1] 0
f1(a, 'x', 'y')
#[1] 3
您可以使用 match
来确保返回 NA
:
a[match("x",rownames(a)), match("y",colnames(a))]
#[1] 3
a[match("x",rownames(a)), match("z",colnames(a))]
#[1] NA
将其包装在 tryCatch
中。没有使用包:
tryCatch(a["x", "y"], error = function(e) 0)
## [1] 3
tryCatch(a["x", "w"], error = function(e) 0)
## [1] 0
我有一个包含行名和列名的矩阵:
a = matrix(1:4,2,2)
dimnames(a) = list(c("x","y"),c("x","y"))
我可以通过行名和列名访问矩阵元素,例如,
a["x","y"]
当我键入 a["x","z"] 时,它给我一个错误“a["x", "z"] 中的错误:下标越界",这应该是。
我的问题是如何得到零而不是那个错误。更准确地说,当我输入不在行名(a)或列名(a)中的错误行名或列名时,它 returns 一个固定值,例如零。例如,零表示 a["x","z"], a["z","t"], ...
我们可以用 purrr
中的 tryCatch
或 possibly
包装来实现这一点
library(purrr)
f1 <- possibly(function(mat, indx1, indx2) mat[indx1, indx2], otherwise = 0)
f1(a, 'x', 'z')
#[1] 0
f1(a, 'x', 'y')
#[1] 3
您可以使用 match
来确保返回 NA
:
a[match("x",rownames(a)), match("y",colnames(a))]
#[1] 3
a[match("x",rownames(a)), match("z",colnames(a))]
#[1] NA
将其包装在 tryCatch
中。没有使用包:
tryCatch(a["x", "y"], error = function(e) 0)
## [1] 3
tryCatch(a["x", "w"], error = function(e) 0)
## [1] 0