gpt4 book ai didi

r - 在 R 中的矩阵中查找模式

转载 作者:行者123 更新时间:2023-12-03 20:31:10 24 4
gpt4 key购买 nike

例如,我有一个 8 x n 矩阵

set.seed(12345)
m <- matrix(sample(1:50, 800, replace=T), ncol=8)
head(m)

[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 37 15 30 3 4 11 35 31
[2,] 44 31 45 30 24 39 1 18
[3,] 39 49 7 36 14 43 26 24
[4,] 45 31 26 33 12 47 37 15
[5,] 23 27 34 29 30 34 17 4
[6,] 9 46 39 34 8 43 42 37

我想在矩阵中找到某种模式,例如我想知道在哪里可以找到 37,下一行是 10 和 29,之后是 42

例如,这发生在上述矩阵的第 57:59 行
m[57:59,]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] *37 35 1 30 47 9 12 39
[2,] 5 22 *10 *29 13 5 17 36
[3,] 22 43 6 2 27 35 *42 50

一个(可能效率低下的)解决方案是获取包含 37 的所有行
sapply(1:nrow(m), function(x){37 %in% m[x,]})

然后使用几个循环来测试其他条件。

我怎么能写一个有效的函数来做到这一点,它可以推广到任何用户给定的模式(不一定超过 3 行,可能有“漏洞”,每行中有可变数量的值等)?

编辑:回答各种评论
  • 我需要找到 EXACT 模式
  • 同一行中的顺序无关紧要(如果方便的话,可以在每行中对值进行排序)
  • 这些线必须相邻。
  • 我想获得返回的所有模式的(起始)位置(即,如果模式在矩阵中多次出现,我想要多个返回值)。
  • 用户将通过 GUI 输入模式,我还没有决定如何。例如,要搜索上述模式,他可能会写类似
  • 的内容。
    37;10,29;42
    哪里 ;代表一个新行和 ,分隔同一行上的值。
    类似地,我们可以寻找
    50,51;;75;80,81

    意思是第 n 行 50 和 51,第 n+2 行 75,第 n+3 行 80 和 81

    最佳答案

    这很容易阅读,希望对你来说足够概括:

    has.37 <- rowSums(m == 37) > 0
    has.10 <- rowSums(m == 10) > 0
    has.29 <- rowSums(m == 29) > 0
    has.42 <- rowSums(m == 42) > 0

    lag <- function(x, lag) c(tail(x, -lag), c(rep(FALSE, lag)))

    which(has.37 & lag(has.10, 1) & lag(has.29, 1) & lag(has.42, 2))
    # [1] 57

    编辑:这是一个可以使用正滞后和负滞后的概括:
    find.combo <- function(m, pattern.df) {

    lag <- function(v, i) {
    if (i == 0) v else
    if (i > 0) c(tail(v, -i), c(rep(FALSE, i))) else
    c(rep(FALSE, -i), head(v, i))
    }

    find.one <- function(x, i) lag(rowSums(m == x) > 0, i)
    matches <- mapply(find.one, pattern.df$value, pattern.df$lag)
    which(rowSums(matches) == ncol(matches))

    }

    在这里测试:
    pattern.df <- data.frame(value = c(40, 37, 10, 29, 42),
    lag = c(-1, 0, 1, 1, 2))

    find.combo(m, pattern.df)
    # [1] 57

    编辑 2:在 OP 对 GUI 输入进行编辑之后,这是一个将 GUI 输入转换为 pattern.df 的函数。我的 find.combo函数期望:
    convert.gui.input <- function(string) {
    rows <- strsplit(string, ";")[[1]]
    values <- strsplit(rows, ",")
    data.frame(value = as.numeric(unlist(values)),
    lag = rep(seq_along(values), sapply(values, length)) - 1)
    }

    在这里测试:
    find.combo(m, convert.gui.input("37;10,29;42"))
    # [1] 57

    关于r - 在 R 中的矩阵中查找模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14154952/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com