2017-04-20 25 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에서 이해하기 때문에, 그렇지 않으면 (= 2 차원 직교 좌표 플러스 오프셋 (offset)) 선형 대수 연산 더 이상 작동하지 않으며 일반적인 코드가 계속 발생합니다. 나는 그것을 얻는다 (나는 생각한다).

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 

이 dataframe 모든 데이터를 가지고 있지만 x, yz 대각선 좌표 것을 "알고있다"어떤 방식으로하지 않습니다.

어떻게 I : I 쉽게 선형 행렬 대수학을 사용할 수 넓은 형태

  1. 매장이,
  2. 사용 정해진 방법 (예를 들어, colSums() 또는 apply())
  3. 로서 편리하게도 print을 다음과 같이 바꾼 것 :

screenshot

(SE는이 인쇄 된 16 진수 그리드를 적절하게 강조 표시하지 않으므로 스크린 샷을 표시합니다.)

즉, 은 "육각형"그리드을 "R"에 "기본적으로"저장하는 우아하고 권장 된/표준적인 방법일까요?

나는 이미 내 자신의 S3 OO를 구현할 수 있음을 모호하게 알고 있습니다. 그러나 이것이 이미 어떤 형태로 존재할 수 있기를 바랬지 만. I 는 연속적인 데이터에 비닝 16 진수 않는 패키지를 많이 찾았어요,하지만 그들은 진수 그리드를 저장, 또는 적어도 그 내부를 노출하지 않았다 처리하는 것 같지 않았어요. 내가 쉽게 사용할 수있는 다양한 형태의

답변

2

1. 상점이 선형 및 매트릭스 대수 아마, 축이 http://www.redblobgames.com/grids/hexagons/#coordinates에 언급 된 좌표

여기 최선의 선택입니다. 이것은 i = x와 j = y 인 표준 ij- 행렬로 변환하는 옵션을 제공 할 수 있습니다. 행렬에 포함될 셀을 지정해야합니다 (자신의 "NA"). 평소와 같이 x와 y 차원을 따라 작업 할 수 있으며 빈 삼각형의 오른쪽 위와 왼쪽 아래 삼각형이있는 행렬을 가질 수 있습니다. (당신의 데이터에 당신의 NA에 대한 다른 솔루션을 찾아야 만합니다.) 예 : 코드를 보충하지 않으셔서 죄송합니다.

2. 기존 방법을 사용하십시오. 당신이

df %>% as_data_frame() %>% group_by(x) %>% summarize(sum(value))

고정 X 등을 위해 요약 할 수 dplyr 패키지를 사용하여 (예를 들어, colSums() 또는 적용())

.

3.뿐만 아니라 편리하게 나는 인쇄에 대한 해결책을 가지고 있지 않지만, ggplot2에 레이블을 표시하는 해결책을 할 수 있습니다

를 인쇄

df %>% as_data_frame() %>% ggplot(aes(x=x+0.5*y, y=y, label=value)) + geom_text()

참고 : 제공된 결과 여기에 당신이 인쇄하고 싶었던 것의 뒤집힌 버전이 있지만, 나는 당신이 자신을 뒤집을 권리를 찾을 수 있기를 바랍니다. x=x+0.5*y은 목표로하는 16 진수 모양을 제공합니다. x=x을 사용하면 기울이기 육각형이 생깁니다.

요약하면 R에 육각형 격자를 "기본적으로"저장하는 것은 우아하고 권장 된/표준적인 방법일까요?

당신은 이미 그것을 발견했습니다. 계산을 위해서는 df를 사용하십시오. 보관을 위해서는 축 방향을 사용하는 것이 좀 더 효율적입니다. z 좌표를 쉽게 추출 할 수 있습니다.