例如:
| | 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
将其转换为长格式,但我喜欢宽格式,因为那是用户界面的样子)。
到目前为止都很好,很熟悉,很直观。
现在进入六边形网格。
我从Amit Patel关于六角格的精彩/权威介绍中了解到,我真的应该像上面的例子一样使用一个立方体坐标系统来保存这样的网格,因为否则(=使用二维笛卡尔坐标加偏移量)线性代数运算就不再起作用,代码变得更加复杂。 我理解了这一点(我想)。
(有关更多详细信息,请参见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
, y
和 z
是对角线坐标。
我该如何:
- 以一种宽格式存储,方便使用线性和矩阵代数,
- 使用已有的方法(比如
colSums()
或者apply()
) - 以及方便地打印成这样:
(SE 甚至不能正确地突出显示这个打印出来的十六进制网格,因此截图。)
总之,什么是在 R 中 “本地化”存储这样的六边形网格 的优雅 / 推荐 / 规范的方法?
我模糊地意识到我可能可以为此实现自己的 S3 OO,但我希望这可能已经以某种形式存在。
我找到了许多处理连续数据的六边形分箱的包,但它们似乎没有处理存储六边形网格,或者至少没有公开这些内部。