【问题标题】:in R, how can I find the row number of the first occurrence and last occurrence of a value in a Matrix?在 R 中,如何找到矩阵中第一次出现和最后一次出现的值的行号?
【发布时间】:2021-03-01 13:28:16
【问题描述】:

在 R 中,我创建了 25x25 的值为 1 和 0 的矩阵,我需要找到矩阵中第一次出现的 1 和矩阵中最后一次出现的 1 之间的高度。 下面是一个字母 a 的矩阵示例,其中每个 1 代表一个黑色像素,每个 0 代表一个白色像素:

    a <- read.csv(csv_files[1]) 
    a
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 V24 V25
1   0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
2   0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
3   0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
4   0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
5   0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
6   0  0  0  0  0  0  0  1  1   1   1   1   0   0   0   0   0   0   0   0   0   0   0   0   0
7   0  0  0  0  0  0  1  1  1   1   1   1   1   0   0   0   0   0   0   0   0   0   0   0   0
8   0  0  0  0  0  1  1  0  0   0   0   0   1   1   1   0   0   0   0   0   0   0   0   0   0
9   0  0  0  0  1  1  0  0  0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0
10  0  0  0  0  1  0  0  0  0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0
11  0  0  0  0  1  0  0  0  0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0
12  0  0  0  0  1  0  0  0  0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0
13  0  0  0  0  1  0  0  0  0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0
14  0  0  0  0  1  0  0  0  0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0
15  0  0  0  0  1  0  0  0  0   0   0   0   0   1   1   0   0   0   0   0   0   0   0   0   0
16  0  0  0  0  1  0  0  0  0   0   0   0   0   1   1   0   0   0   0   0   0   0   0   0   0
17  0  0  0  0  1  1  0  0  0   0   0   0   1   1   1   1   0   0   0   0   0   0   0   0   0
18  0  0  0  0  0  1  1  0  0   0   0   1   1   0   0   1   0   0   0   0   0   0   0   0   0
19  0  0  0  0  0  0  1  1  1   1   1   1   0   0   0   1   1   0   0   0   0   0   0   0   0
20  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
21  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
22  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
23  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
24  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
25  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

我的想法是找到最后一次出现 1 的行号和第一次出现 1 的行号并将它们彼此分开,这会给我符号的高度。 在这种情况下,它将是 19 - 6 = 13,所以高度是 13。

为了上下文,我在 GIMP 上绘制了不同字母和符号的图像,并将它们导入到 R 中并将它们作为 CSV 文件保存在矩阵中。

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    试试下面的代码

    > diff(range(which(a == 1, arr.ind = TRUE)[, "row"]))
    [1] 13
    

    数据

    > dput(a)
    structure(list(V1 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L),
        V2 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
        0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), V3 = c(0L,
        0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
        0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), V4 = c(0L, 0L, 0L, 0L,
        0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
        0L, 0L, 0L, 0L, 0L, 0L), V5 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
        0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L,
        0L, 0L, 0L), V6 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L,
        0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L
        ), V7 = c(0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L,
        0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L), V8 = c(0L,
        0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
        0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L), V9 = c(0L, 0L, 0L, 0L,
        0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L,
        0L, 0L, 0L, 0L, 0L, 0L), V10 = c(0L, 0L, 0L, 0L, 0L, 1L,
        1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L,
        0L, 0L, 0L, 0L), V11 = c(0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L,
        0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L,
        0L, 0L), V12 = c(0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L,
        0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L
        ), V13 = c(0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L,
        0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), V14 = c(0L,
        0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L,
        1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), V15 = c(0L, 0L, 0L,
        0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L,
        0L, 0L, 0L, 0L, 0L, 0L, 0L), V16 = c(0L, 0L, 0L, 0L, 0L,
        0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L,
        0L, 0L, 0L, 0L, 0L), V17 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L,
        0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L,
        0L, 0L, 0L), V18 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
        0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
        0L), V19 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
        0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L),
        V20 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
        0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), V21 = c(0L,
        0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
        0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), V22 = c(0L, 0L, 0L,
        0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
        0L, 0L, 0L, 0L, 0L, 0L, 0L), V23 = c(0L, 0L, 0L, 0L, 0L,
        0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
        0L, 0L, 0L, 0L, 0L), V24 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L,
        0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
        0L, 0L, 0L), V25 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
        0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
        0L)), class = "data.frame", row.names = c("1", "2", "3",
    "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", 
    "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"))
    

    【讨论】:

    • 谢谢老兄,效果很好。您能否解释一下代码“diff(range(which(a == 1, arr.ind = TRUE)[, "row"]))”?
    • @Niall which with option arr.ind = TRUE 给出了一个矩阵,包括满足a==1 的行号和列号。我们专注于行号,因此我们将[,"row"] 应用于行号的子集。 range 给出最小值和最大值,diff 计算差值,即高度。
    • 如果我将 [, "row"] 更改为 ["col", ] 是否也适用于宽度?
    • @Niall "row" 是索引矩阵的一列名称。如果要从除"row" 列之外的所有行中检索数据,则应使用[, "row"] ["col", ] 表示所有列中来自行 "col" 的所有数据。你可以先试试which看看它产生了什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多