我该如何在R中“本地”存储六边形网格?

3
如果我想在R中保存一些方形网格,那很容易实现。
例如:
|    | 0    | 1     | 2     |
|----|------|-------|-------|
| 0  | TRUE | TRUE  | FALSE |
| 1  | NA   | FALSE | TRUE  |
| 2  | TRUE | TRUE  | FALSE |

存储为笛卡尔坐标系

m <- matrix(data = c(TRUE, TRUE, FALSE, NA, FALSE, TRUE, TRUE, TRUE, FALSE), nrow = 3, ncol = 3, byrow = FALSE)

现有的方法和数学计算都如预期一样运作:

apply(X = m, MARGIN = 2, FUN = "sum")
# [1]  2 NA  2
print(m)
#      [,1]  [,2]  [,3]
#[1,]  TRUE    NA  TRUE
#[2,]  TRUE FALSE  TRUE
#[3,] FALSE  TRUE FALSE

(我知道我也可以使用 reshape2::melt 将其转换为长格式,但我喜欢宽格式,因为那是用户界面的样子)。

到目前为止都很好,很熟悉,很直观。


现在进入六边形网格。

some grid

我从Amit Patel关于六角格的精彩/权威介绍中了解到,我真的应该像上面的例子一样使用一个立方体坐标系统来保存这样的网格,因为否则(=使用二维笛卡尔坐标加偏移量)线性代数运算就不再起作用,代码变得更加复杂。 我理解了这一点(我想)。

Cube coordinate system

(有关更多详细信息,请参见Amit Patel的fantastic 解释器)。

通过 array()宽格式输入此数据似乎完全是荒谬的,因为许多单元格甚至不存在(并且已经使用了NA)。 所以我将其以长格式输入/存储,如下所示:

df <- rbind(c(1, 0, -1, FALSE), 
        c(0, 1, -1, NA),
        c(1, -1, 0, TRUE),
        c(0, 0, 0, TRUE),
        c(-1, 1, 0, FALSE),
        c(0, -1, 1, NA),
        c(-1, 0, 1, TRUE))
colnames(df) <- c("y", "x", "z", "value")
df
#      y  x  z value
#[1,]  1  0 -1     0
#[2,]  0  1 -1    NA
#[3,]  1 -1  0     1
#[4,]  0  0  0     1
#[5,] -1  1  0     0
#[6,]  0 -1  1    NA
#[7,] -1  0  1     1

这个数据集包含所有的数据,但是不知道 x, yz 是对角线坐标。

我该如何:

  1. 以一种宽格式存储,方便使用线性和矩阵代数,
  2. 使用已有的方法(比如 colSums() 或者 apply()
  3. 以及方便地打印成这样:

screenshot

(SE 甚至不能正确地突出显示这个打印出来的十六进制网格,因此截图。)

总之,什么是在 R 中 “本地化”存储这样的六边形网格 的优雅 / 推荐 / 规范的方法?

我模糊地意识到我可能可以为此实现自己的 S3 OO,但我希望这可能已经以某种形式存在。

我找到了许多处理连续数据的六边形分箱的包,但它们似乎没有处理存储六边形网格,或者至少没有公开这些内部。

1个回答

3

1. 将这个数据以宽格式存储,以便可以轻松使用线性和矩阵代数

可能,在http://www.redblobgames.com/grids/hexagons/#coordinates中提到的轴坐标是最好的选择。这可以提供将其转换为标准的ij矩阵的选项,其中i=x,j=y,您只需要指定要放入未被您的六边形网格覆盖的矩阵单元格中的内容(您自己的“NA”)。然后,您可以像往常一样沿着x和y维度进行操作,并获得一个具有空的三角形右上角和左下角的矩阵。(这不是荒唐的,而是自然的方式。对于您的数据中的NA,您最好找到另一种解决方案。很抱歉我没有调试出您的示例代码。)

2. 使用已建立的方法(例如colSums()或apply())

使用dplyr包,您可以

df %>% as_data_frame() %>% group_by(x) %>% summarize(sum(value))

对于固定的x进行求和等操作。

3. 同时方便地打印

我没有关于打印的解决方案,但是使用ggplot2显示标签可能是一种解决方案

df %>% as_data_frame() %>% ggplot(aes(x=x+0.5*y, y=y, label=value)) + geom_text()

注:此处提供的结果是您想要打印的结果的翻转版本,但希望您可以自己找到正确的翻转方式。在这里,x=x+0.5*y用于给您所需的六边形形状。使用x=x只会得到一个倾斜的六边形。

简而言之,在R中“本地”存储这样的六边形网格的优雅/推荐/规范方式是什么?

您已经找到了它。对于计算,您使用您的df。对于存储,使用轴向更有效率一些。您可以轻松提取回z坐标。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接