3

種のデータセットと、100 x 200 メートルの領域での大まかな位置があります。データ フレームの場所の部分は、使用できる形式ではありません。この 100 x 200 メートルの長方形には、A ~ CV という名前の 10 x 10 メートルの正方形が 200 個あります。各 10 x 10 の正方形内には、それぞれ 1、2、3、および 4 という名前の 4 つの 5 x 5 メートルの正方形があります (1 は 2 の南、3 の西です。4 は 2 の東、3 の北です)。A が (0 ,0)、(10,0)、(0,0)、および (0,10) の角を持つ正方形であり、B が A のすぐ北にあり、角がある ( 0,10)、(0,20)、(10,10)、(10,20)、K は A のすぐ東にあり、(10,0)、(10,10)、(20, 0)、(20,10) など、すべての 10 x 10 メートルの正方形について。さらに、各 5 x 5 メートルの正方形が 100 x 200 メートルのプロットのどこにあるかを R に知らせたいと思います。

だから、私のデータフレームは次のようになります

10x10    5x5     Tree    Diameter
A    1     tree1    4
B    1     tree2    4
C    4     tree3    6
D    3     tree4    2
E    3     tree5    3
F    2     tree6    7
G    1     tree7    12
H    2     tree8    1
I    2     tree9    2
J    3     tree10   8
K    4     tree11   3
L    1     tree12   7
M    2     tree13   5

最終的には、100 x 200 メートルの領域をプロットし、各 10 x 10 メートルの正方形に木の数、種の数、または総バイオマスを表示できるようにしたいと考えています。 Rがグラフ化やおそらく分析に使用できる空間データに?

4

2 に答える 2

6

ここから始めます。

## set up a vector of all 10x10 position tags
tags10 <- c(LETTERS,
            paste0("A",LETTERS),
            paste0("B",LETTERS),
            paste0("C",LETTERS[1:22]))

{"J",3}対応するサブ正方形の中心に(たとえば) 変換する関数。

convpos <- function(pos10,pos5) {
    ## convert letters to major (x,y) positions
    p1 <- as.numeric(factor(pos10,levels=tags10))  ## or use match()
    p1.x <- ((p1-1) %% 10) *10+5    ## %% is modulo operator
    p1.y <- ((p1-1) %/% 10)*10+5    ## %/% is integer division
    ## sort out sub-positions
    p2.x <- ifelse(pos5 <=2,2.5,7.5)   ## {1,2} vs {3,4} values
    p2.y <- ifelse(pos5 %%2 ==1 ,2.5,7.5)  ## odd {1,3} vs even {2,4} values
    c(p1.x+p2.x,p1.y+p2.y)
}

利用方法:

convpos("J",2)
convpos(mydata$tenbytenpos,mydata$fivebyfivepos)

重要事項:

  • これは概念実証です。x 座標と y 座標の対応が正しくないことはほぼ保証できます。しかし、この行ごとにトレースして、それが何をしているのかを見ることができるはずです...
  • ベクトルで正しく動作するはずです (上記の 2 番目の使用例を参照):その理由でからswitchに切り替えましたifelse
  • 列名 ( ) は、データを R に読み込むとき10x10のように壊れてしまう可能性があります: と を参照してください。X10.10?data.frame?check.names
于 2012-08-24T22:10:40.080 に答える
5

@Ben Bolker が行ったことと同様に、ここにルックアップ関数があります (ただし、ラベルを記述したものと一致させるために何かを転置する必要がある場合があります)。

tenbyten <- c(LETTERS[1:26], 
  paste0("A",LETTERS[1:26]), 
  paste0("B",LETTERS[1:26]), 
  paste0("C",LETTERS[1:22]))

tenbyten <- matrix(rep(tenbyten, each = 2), ncol = 10)
tenbyten <- t(apply(tenbyten, 1, function(x){rep(x, each = 2)}))
# the 1234 squares
squares <- matrix(c(rep(c(1,2),10),rep(c(4,3),10)), nrow = 20, ncol = 20)
# stick together into a reference grid
my.grid <- matrix(paste(tenbyten, squares, sep = "-"), nrow = 20, ncol = 20)

# a lookup function for the site grid
coordLookup <- function(tbt, fbf, .my.grid = my.grid){
  x <- col(.my.grid) * 5 - 2.5
  y <- row(.my.grid) * 5 - 2.5
  marker <- .my.grid == paste(tbt, fbf, sep = "-")
  list(x = x[marker], y = y[marker])
}

coordLookup("BB",2)
$x
[1] 52.5

$y
[1] 37.5

これがあなたが探しているものではない場合は、SpatialPolygonsDataFrame適切なポリゴン ID を持ち、データをアタッチするなどを好むかもしれません。row()およびcol()関数を使用して、重心のみを返すこのルックアップ関数で指定されているものと同様に、ポリゴンの角を取得します。

編集: SPDF の開始:

これは関数の例から変更されたものであり、うまくいけば良いスタートになるでしょう:

library(sp)
# really you have a 20x20 grid, counting the small ones.
# c(2.5,2.5) specifies the distance in any direction from the cell center
grd <- GridTopology(c(1,1), c(2.5,2.5), c(20,20)))
grd <- as.SpatialPolygons.GridTopology(grd)
# get centroids
coords <- coordinates(polys)
# make SPDF, with an extra column for your grid codes, taken from the above.
# you can add further columns to this data.frame(), using polys@data
polys <- SpatialPolygonsDataFrame(grd, 
  data=data.frame(x=coords[,1], y=coords[,2], my.ID = as.vector(my.grid), 
  row.names=getSpPPolygonsIDSlots(grd)))
于 2012-08-24T22:40:34.730 に答える