1

R で試してみたい特定のタスクが割り当てられました。インポートするシェープファイル (SpatialPoints df) は、いくつかの属性で構成されていますが、最も重要なのは、特定のポイント座標 (緯度/経度) の商用キャッチ ウェイトです。

次のスクリプトが必要です。

1) グリッドを作成します (サイズと単位を変更できます) 2) インポートしたファイルと交差して、サンプル (平均値、標準偏差、範囲など) をグリッドの正方形で要約します。

私は ArcGIS を介してこれを行うことができますが、グリッド サイズを変更しやすく、R を介して再利用可能なアルゴリズムを持つことに興味があります。以下は、使用されているデータの短い例です。

誰でもこれを行う方法を知っていますか?

   ENT_LATITU ENT_LONGIT   CSK
     415300     654400  195.954
     430100     622200   21.228
     442300     631000  232.423
     424700     642300   77.837
     442800     630600  154.586
     424600     642900    9.253
4

3 に答える 3

1

を使うべきだと思いggplot2ますgeom_raster()。合成データを使用した例を次に示します。最初に 30x30 のグリッドを作成し、それを任意の x/y 集計にトリミングする方法を示します。

require(ggplot2)
require(plyr)

## CREATE REASONABLE SIZE GRID 30x30
dfe<-expand.grid(ENT_LATITU=seq(415000,418000,100),
            ENT_LONGIT=seq(630000,633000,100),
            CSK=0)
## FILL WITH RANDOM DATA
dfe$CSK=round(rnorm(nrow(dfe),200,50),0)

#######################################################
#####  VALUES TO CHANGE IN THIS BLOCK             #####
#######################################################
## TRIM ORIGINAL DATASET
lat.max<-Inf       # change items to trim data
lat.min<-0       
long.max<-Inf    
long.min<-631000      
dfe.trim<-dfe[findInterval(dfe$ENT_LATITU,c(lat.min,lat.max))*findInterval(dfe$ENT_LONGIT,c(long.min,long.max))==1,]
## SUMMARIZE TO NEW X/Y GRID
xblocks<-6
yblocks<-8

## GRAPH COLOR AND TEXT CONTROLS
showText<-TRUE
txtSize<-3
heatmap.low<-"lightgreen"
heatmap.high<-"orangered"
#######################################################
#####                                             #####
#######################################################

## BASIC PLOT (ALL DATA POINTS)
ggplot(dfe) +
  geom_raster(aes(ENT_LATITU,ENT_LONGIT,fill=CSK)) + theme_bw() +
  scale_fill_gradient(low=heatmap.low, high=heatmap.high) +
  geom_text(aes(ENT_LATITU,ENT_LONGIT,label=CSK,fontface="bold"),
            color="black",
            size=2.5) 

基本プロット:

ここに画像の説明を入力

次に、集計されたプロット:

## CALL ddply to roll-up the data and calculate summary means, SDs,ec
dfe.plot<-ddply(dfe.trim,
      .(lat=cut(dfe.trim$ENT_LATITU,xblocks),
        long=cut(dfe.trim$ENT_LONGIT,yblocks)),
      summarize,
      mean=mean(CSK),
      sd=sd(CSK),
      sum=sum(CSK),
      range=paste(min(CSK),max(CSK),sep="-"))

## BUILD THE SUMMARY CHART
g<-ggplot(dfe.plot) +
  geom_raster(aes(lat,long,fill=sum),alpha=0.75) +
  scale_fill_gradient(low=heatmap.low, high=heatmap.high) +
  theme_bw() + theme(axis.text.x=element_text(angle=-90)) +
  ggtitle(paste(xblocks,
                " X ",
                yblocks,
                " grid of Catch Data\nbetween ( ",
                min(dfe.trim$ENT_LATITU),
                " : ",
                min(dfe.trim$ENT_LONGIT),
                " ) and ( ",
                max(dfe.trim$ENT_LATITU),
                " : ",
                max(dfe.trim$ENT_LONGIT),
                " )\n\n",
                sep=""))

## ADD THE LABELS IF NEEDED
if(showText)g<-g+geom_text(aes(lat,long,label=paste("SUM=",round(sum,0),
                                            "\nMEAN=",round(mean,1),
                                            "\nSD=",round(sd,1),
                                            "\nRNG=",range,sep=""),
                                  fontface=c("italic")),
                                  color="black",size=txtSize)

## FUDGE THE LABELS TO MAKE MORE READABLE
## REPLACE "," with newline and "]" with ")"
g$data[,1:2]<-gsub("[,]",replacement=" to\n",x=as.matrix(g$data[,1:2]))
g$data[,1:2]<-gsub("]",replacement=")",x=as.matrix(g$data[,1:2]))

## PLOT THE CHART
g + labs(x="\nLatitude", y="Longitude\n", fill="Sum\nBlock\n")

## SHOW HEADER OF data.plot
head(dfe.plot)

ここに画像の説明を入力

于 2013-11-29T10:15:35.310 に答える
0

mean2 つの座標セットを中間点で分割することによって形成される範囲で関数を適用する「dat」という名前のデータ オブジェクトがある場合:

# dput(dat)
dat <- 
structure(list(ENT_LATITU = c(415300L, 430100L, 442300L, 424700L, 
442800L, 424600L), ENT_LONGIT = c(654400L, 622200L, 631000L, 
642300L, 630600L, 642900L), CSK = c(195.954, 21.228, 232.423, 
77.837, 154.586, 9.253)), .Names = c("ENT_LATITU", "ENT_LONGIT", 
"CSK"), class = "data.frame", row.names = c(NA, -6L))

with(dat, tapply(CSK, list(lat.cut=cut(ENT_LATITU, 2), 
                           lon.cut=cut( ENT_LONGIT ,2)), 
                      mean))
#--------------------------------
                     lon.cut
lat.cut               (6.22e+05,6.38e+05] (6.38e+05,6.54e+05]
  (4.15e+05,4.29e+05]                  NA              94.348
  (4.29e+05,4.43e+05]             136.079                  NA

これにより、テーブル オブジェクト (matrix-class から継承) が得られます。

于 2013-11-28T16:26:21.163 に答える