【问题标题】:How to index coordinate data according to a grid in R?如何根据R中的网格索引坐标数据?
【发布时间】:2020-06-02 15:19:25
【问题描述】:

我的坐标数据(x 坐标和 y 坐标)的比例介于: Xpos:27-1367nm,Ypos:67-1014nm。一个数据集由大约 2500-3500 个数据点组成。 这是这样一个数据集的标题:

   XPos YPos
1    29  211
2    31  609
3    33 1001
4    35  508
5    37  424
6    39  584
7    40  378
8    41  204
9    41  444
10   41  872 
...

[![绘制的数据][1]][1]

现在我想通过将由相等大小的象限组成的网格应用于 R 中的数据来索引数据点。结果应该是一个新列“grid_index”,其中包含数据点所在的唯一 quadrant_ID(请参阅图片)。是否有捷径可寻?我想尝试不同的网格单元大小来划分数据,例如大小为 50nm、100nm、200nm 或 400nm 的象限和大小为 100nm x 200nm 或 50nm x100nm 的矩形。

[![用于数据品脱索引的网格][2]][2]

[![每个网格象限都应该有一个唯一的 ID][3]][3]

如果有任何帮助,我将不胜感激。

【问题讨论】:

    标签: r indexing grid coordinates partitioning


    【解决方案1】:

    这是findInterval的一种方法:

    首先建立一个具有适当数量索引的矩阵:

    pos.matrix <- matrix(1:35,byrow = TRUE, nrow = 5)
    pos.matrix
         [,1] [,2] [,3] [,4] [,5] [,6] [,7]
    [1,]    1    2    3    4    5    6    7
    [2,]    8    9   10   11   12   13   14
    [3,]   15   16   17   18   19   20   21
    [4,]   22   23   24   25   26   27   28
    [5,]   29   30   31   32   33   34   35
    

    接下来使用findInterval 找到它所在的矩阵的索引。您可以使用by = 参数控制网格的大小。请注意,矩阵的维度必须与findInterval 中提供的间隔数相匹配。我们需要使用abs,因为图表上的 y 值正在减少。

    grid <- apply(cbind(findInterval(data[,"XPos"],seq(0,1400,by = 200)),
                        abs(findInterval(data[,"YPos"],seq(0,1000,by = 200)) - 6)),
                  MARGIN = 1,
                  function(x) pos.matrix[x[2],x[1]])
    grid[1:25]
    [1] 30 34 31 17 19 26 15 31 19  5 18 32 25 25 14 20 22 19 35  2 16  8 29 29 16
    plot(NA,xlim = c(0,1400), ylim = c(0,1000), xlab = "XPos", ylab = "YPos", cex.axis = 0.8)
    text(data[,1],data[,2], labels = grid, cex = 0.4)
    

    样本数据

    set.seed(3)
    data <- data.frame(XPos = runif(1000,0,1400), YPos = runif(1000,0,1000))
    

    【讨论】:

    • 问题是他的数据本身不是矩阵格式。所以他需要将他的数据转换成一个矩阵,这会在其中引入 0,这可能会使你的答案无效,除非你能找到一种方法来调整解决方案以在 2 列数据帧上工作。
    • 它目前适用于 2 列 data.frame。请参阅示例数据部分。
    • 嗨伊恩!非常感谢。我用我的数据试了一下,效果很好。我对 R 和编码比较陌生,我正在尝试了解您提供的解决方案。你能解释一下“MARGIN = 1”这个论点的作用吗?谢谢!
    • apply 沿矩阵、数组或 data.frame 的边缘应用函数。因为cbind 制作了一个 2 列矩阵,所以我们希望将我们的函数应用于该矩阵的每一行。 1 边距适用于每一行,2 边距适用于每一列。您实际上可以直接子集pos.matrix,但我认为这会更容易理解。
    猜你喜欢
    • 1970-01-01
    • 2021-07-08
    • 2013-01-18
    • 2018-08-17
    • 2018-11-23
    • 1970-01-01
    • 2015-09-28
    • 2019-04-21
    • 1970-01-01
    相关资源
    最近更新 更多