如何测试矩阵列表中是否存在矩阵(WordleProject)

我是一个不常见的 R 用户,所以如果我的任何术语不正确,我深表歉意。我正在围绕游戏 Wordle 进行一个项目,以查看我的家庭群组聊天中给定的 Wordle 提交是否唯一,或者它们是否已经提交过。这样做的灵感来自 Twitter 帐户“Scorigami”,该帐户跟踪每场 NFL 比赛,并在 Twitter 上发布该分数是否在联盟历史上发生过。

我是一个不常见的 R 用户,所以如果我的任何术语不正确,我深表歉意。我正在围绕游戏 Wordle 进行一个项目,以查看我的家庭群组聊天中给定的 Wordle 提交是否唯一,或者它们是否已经提交过。这样做的灵感来自 Twitter 帐户“Scorigami”,该帐户跟踪每场 NFL 比赛,并在 Twitter 上发布该分数是否在联盟历史上发生过。

要将 Wordle 条目加载到 R 中,我决定将每个提交转换为一个矩阵,其中 0 = 不正确的字母,1 = 正确的字母 / 错误的位置,2 = 正确的字母 / 正确的位置。

wordle_brendan <- rbind(c(1,0,0,0,0),c(2,2,0,0,0),c(2,2,0,0,0),c(2,2,2,2,2))
wordle_jack <- rbind(c(2,0,0,0,0),c(2,2,0,0,0),c(2,2,2,2,2))

然后,我将它们合并到一个列表中,该列表将用于检查将来的任何 Wordle 提交,以查看它们是否以前提交过。

list <- list(wordle_brendan, wordle_jack)

我想我在正确的轨道上,但我不知道如何创建一个新的 wordle 矩阵来测试之前是否已经提交。说我重新创建了“wordle_brendan”具有相同的值,但在不同的名称...然后我如何让 R 检查该矩阵是否存在于我预先存在的矩阵列表中?

2

有多种方法可以做到这一点,但这很简单,我们需要一些样本来检查:

new1 <- list[[2]]   # The same as your second matrix
new2 <- new1
new2[3, 5] <- 0     # Change one position from 2 to 0.

要比较

any(sapply(list, identical, y=new1))
# [1] TRUE
any(sapply(list, identical, y=new2))
# [1] FALSE

所以new1匹配一个现有的矩阵,但是new2不匹配。

which(sapply(list, identical, y=new1))
# [1] 2
which(sapply(list, identical, y=new2))
# integer(0)

所以new1匹配list中的第二个矩阵,但是new2不匹配任何矩阵。

0

基本函数identical比较对象,而不是值,如果矩阵具有相同的值,但不同的属性,如名称,identical返回 FALSE。

在这些情况下,仅比较值的函数将返回 TRUE。

我将使用dcarlson'snew1来说明这一点。

matequal <- function(x, y) {
  ok <- is.matrix(x) && is.matrix(y) && all(dim(x) == dim(y))
  ok && all(x == y)
}
wordle_brendan <- rbind(c(1,0,0,0,0),c(2,2,0,0,0),c(2,2,0,0,0),c(2,2,2,2,2))
wordle_jack <- rbind(c(2,0,0,0,0),c(2,2,0,0,0),c(2,2,2,2,2))
list <- list(wordle_brendan, wordle_jack)
new1 <- list[[2]]   # The same as your second matrix
wordle_john <- wordle_jack
dimnames(wordle_john) <- list(1:3, letters[1:5])
list2 <- list(wordle_brendan, wordle_jack, wordle_john)
sapply(list2, identical, y=new1)
#> [1] FALSE  TRUE FALSE
sapply(list2, matequal, y=new1)
#> [1] FALSE  TRUE  TRUE

创建于 2022-09-27 与reprex v2.0.2

编辑

identical不是比较两个对象的值的函数,而是比较对象本身的函数。在下面的示例中,identical返回 FALSE,尽管xy具有通常意义上的相等值。

matequal <- function(x, y) {
  ok <- is.matrix(x) && is.matrix(y) && all(dim(x) == dim(y))
  ok && all(x == y)
}
x <- matrix(1:5, ncol = 1)
y <- matrix(1 + 0:4, ncol = 1)
all(x == y)
#> [1] TRUE
identical(x, y)
#> [1] FALSE
matequal(x, y)
#> [1] TRUE

创建于 2022-09-28 与reprex v2.0.2

这是因为从 C语言借来的xy的内部表示对应于不同的类属性。其中一个对象存储类"integer"的元素和类"numeric"的其他元素。矩阵都具有相同的类属性("matrix" "array"),矩阵元素的存储类型是主要区别。

comment中,询问

谢谢你和 dcarlson 的回应!关于你的两个 sapply 行,你能解释一下使用 matequal 而不是完全相同的后面会有什么用途吗?是 matequal 考虑列和行名称的唯一区别?

因此,注释中问题的答案是否定的,属性,在这种情况下dimnames,并不是identical在某些或多次比较 R 对象时不理想的唯一原因。

typeof(x)
#> [1] "integer"
typeof(y)
#> [1] "double"
class(x[1])
#> [1] "integer"
class(y[2])
#> [1] "numeric"
class(x)
#> [1] "matrix" "array"
class(y)
#> [1] "matrix" "array"

创建于 2022-09-28 与reprex v2.0.2

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(474)
如何使用Objectivec在iOS9.3中将动画添加到启动屏幕
上一篇
如何将列号(例如127)转换为Excel列(例如AA)
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(71条)