如果我想在R中保存一些平方網格,那很容易完成。我如何「本地」存儲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
這成長形式,但我喜歡它,因爲這就是UI的樣子)。
到目前爲止好好,熟悉,直觀。
現在進入六角網格。
我從Amit Patel's marvellous/authoritative introduction to hex grids明白,我真的應該使用立方體座標系,如在上面的例子中,以節省這樣的網格,因爲否則(=與2D笛卡爾座標加上偏移)線性代數運算不再工作,並且通用代碼的嚴重性隨之而來。 我明白了(我認爲)。
(有關詳細信息,再次看到阿米特·帕特爾的奇妙explainer)。
通過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()
) - 如以及方便
print
到這樣的事情:
(SE甚至不會正確地突出顯示此打印的六角網格,因此屏幕截圖。)
什麼,簡而言之,就是「本地」在R中存儲這樣一個六邊形網格的優雅/推薦/規範方式?
我隱約意識到我可以實現我自己的S3 OO,儘管我希望這可能已經以某種形式存在。 我沒有找到很多那些詛咒連續數據裝箱包,但他們似乎並沒有處理存儲六角格,或者至少沒有公開這些內幕。