【发布时间】:2017-04-20 21:24:54
【问题描述】:
如果我想在 R 中保存一些 square 网格,这很容易做到。
说,
| | 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 转换成长格式,但我喜欢它的宽泛,因为 UI 就是这样的)。
到目前为止一切都很好、熟悉、直观。
现在进入六边形网格。
我从Amit Patel's marvellous/authoritative introduction to hex grids 了解到,我真的应该使用 立方体坐标系 来保存这样的网格,就像上面的示例一样,因为否则(= 使用 2d 笛卡尔坐标加上偏移量)线性代数操作不再起作用,随之而来的是一般的代码粗略。 我明白了(我想)。
(有关更多详细信息,请再次参阅 Amit Patel 的精彩 explainer)。
通过array() 以wide 形式输入这些数据似乎完全是疯狂的,因为许多单元格甚至都不存在(并且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()) - 以及方便
print到这样的东西:
(SE 甚至无法正确突出显示此打印的十六进制网格,因此是屏幕截图。)
简而言之,在 R 中“本地”存储这种六边形网格的优雅/推荐/规范方式是什么?
我隐约意识到我可能为此实现自己的 S3 OO,尽管我希望这可能已经以某种形式存在。 我确实找到了很多对连续数据进行十六进制binning的包,但它们似乎没有处理存储十六进制网格,或者在至少没有暴露那些内部结构。
【问题讨论】:
标签: r matrix coordinate-systems r-grid hexagonal-tiles