Если я хочу сохранить некоторую квадратную сетку в 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
преобразовать это в длинную форму, но мне нравится широкая, потому что так выглядит пользовательский интерфейс).
Пока все хорошо, знакомо, интуитивно понятно.
Теперь введите шестиугольную сетку.
Из замечательного/авторитетного введения Амита Пателя в шестигранные сетки я понял, что действительно должен сохранять такие сетка с использованием кубической системы координат, как в приведенном выше примере, поскольку в противном случае (= с двумерными декартовыми координатами плюс смещения) операции линейной алгебры больше не работают, и возникает общая грубость кода. Я понимаю (думаю).
(Для получения дополнительной информации, опять же, см. фантастический объяснитель Амита Пателя).
Ввод этих данных в широкой форме через 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, хотя я надеялся, что это может уже существовать в той или иной форме. Я действительно нашел множество пакетов, выполняющих шестнадцатеричное биннинг непрерывных данных, но они, похоже, не имели дело с хранением шестнадцатеричных сеток или по крайней мере, не подвергать эти внутренности.