2017-04-20 105 views
1

如果我想在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的樣子)。

到目前爲止好好,熟悉,直觀。


現在進入六角網格。

some grid

我從Amit Patel's marvellous/authoritative introduction to hex grids明白,我真的應該使用立方體座標系,如在上面的例子中,以節省這樣的網格,因爲否則(=與2D笛卡爾座標加上偏移)線性代數運算不再工作,並且通用代碼的嚴重性隨之而來。 我明白了(我認爲)。

Cube coordinate system

(有關詳細信息,再次看到阿米特·帕特爾的奇妙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 

此數據框擁有的所有數據,但並不「知道」以任何方式,即xyz是對角座標。

我怎樣才能:

  1. 此存儲在形式,我可以很容易地使用線性和矩陣代數,
  2. 使用已建立的方法(比如,colSums(),或apply()
  3. 如以及方便print到這樣的事情:

screenshot

(SE甚至不會正確地突出顯示此打印的六角網格,因此屏幕截圖。)

什麼,簡而言之,就是「本地」在R中存儲這樣一個六邊形網格的優雅/推薦/規範方式?

我隱約意識到我可以實現我自己的S3 OO,儘管我希望這可能已經以某種形式存在。 我沒有找到很多那些詛咒連續數據裝箱包,但他們似乎並沒有處理存儲六角格,或者至少沒有公開這些內幕。

回答

2

1.商店這在很寬的形式,其中我可以輕鬆地使用線性和矩陣 代數

也許,軸向座標中http://www.redblobgames.com/grids/hexagons/#coordinates提到在這裏的最佳選擇。這可以給出選項來轉換爲i = x和j = y的標準ij矩陣,您只需指定要放入矩陣單元格中的內容,這些矩陣單元不包含在您的六角形網格中(您自己的「NA」 )。然後,您可以像平常一樣沿維x和y進行操作,並且只有空白的三角形右上角和左下角三角形。 (這不是瘋狂的,但自然的方式,最好你必須在你的數據中找到你的NA的不同解決方案,對不起,沒有爲你的例子找出代碼)

2.使用已建立的方法(比方說,colSums(),或適用())

使用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座標。