如何从点数据中生成存在和缺失数据

时间:2015-11-10 17:22:29

标签: r

我有点数据(Lon和Lat),我想从中创建存在和缺失数据。我怎么能在R中这样做?示例如下。

加载数据:

df <- read.table(text=
"species        lon   lat
Oncorhynchus_kisutch    -130.25 55.75
Oncorhynchus_kisutch    -129.75 55.75
Oncorhynchus_kisutch    -130.25 55.25
Oncorhynchus_kisutch    -129.75 55.25
Oncorhynchus_kisutch    -129.25 55.25
Oncorhynchus_kisutch    -133.25 54.75
Oncorhynchus_kisutch    -131.75 54.75
Oncorhynchus_kisutch    -131.25 54.75
",
header=TRUE
)
head(df)

 # create grid
reso = 0.25
xs <- seq(-180, 180, by=reso)
ys <- seq(-90, 90, by=reso)
grd <- expand.grid(
  x=xs,
  y=ys,
  presence=0
)
head(grd)

# query
for(i in seq(nrow(df))){
  tmp <- which(df$lon[i] == grd$x & df$lat[i] == grd$y)
  if(length(tmp)>0){
    grd$presence[tmp] <- 1
  }
}

png("plot.png", width=5, height=5, units="in", res=600, type="cairo")
plot(grd$x, grd$y, pch=1, cex=1, col=c(NA, 1)[grd$presence+1], lwd=0.5)
dev.off()

但是,当我使用不规则的Lon和Lat数据时,这段代码对我不起作用:

  Lat            Lon
24.08333    32.88333
30.00486    31.23571
32.5        27.5
33.333     -8.417
34.395      26.05383
34.5       -6.917
35          15
35.0738     32.3335
35.19509    25.71726
35.2047     25.7221
35.26665    26.22368
35.33198    25.39159

1 个答案:

答案 0 :(得分:0)

这是因为你的点的Lon / Lat与网格x和y不完全匹配。 您将不得不使用每个网格单元格的范围而不是x和y(仅定义网格的中心或角)。即使用x +/- 0.125和y +/- 0.125。这假设网格值是针对单元中心而不是其中一个角。您必须根据您想要的网格规范进行调整。 我将数据框中的值更改为不在网格上的点。检查一下这是否适合您:

df <- read.table(text=
                      "species        lon   lat
                  Oncorhynchus_kisutch    -130.7 55.95
                  Oncorhynchus_kisutch    -129.6 55.235
                  Oncorhynchus_kisutch    -130.21 55.34
                  Oncorhynchus_kisutch    -129.751 55.901
                  Oncorhynchus_kisutch    -129.2509 55.5
                  Oncorhynchus_kisutch    -133.99 54.834
                  Oncorhynchus_kisutch    -131.9 54.75
                  Oncorhynchus_kisutch    -131.25 54.532
                  ",
                 header=TRUE
)
head(df)

 # create grid
reso = 0.25
xs <- seq(-180, 180, by=reso)
ys <- seq(-90, 90, by=reso)
grd <- expand.grid(
  x=xs,
  y=ys,
  presence=0
)
head(grd)

# query
for(i in seq(nrow(df))){
     tmp <- which(df$lon[i] >= grd$x-0.125 & df$lon[i] < grd$x+0.125 & df$lat[i] >= grd$y-0.125 & df$lat[i] < grd$y+0.125)
     if(length(tmp)>0){
         grd$presence[tmp] <- 1
     }
 }
table(grd$presence)
grd[grd$presence==1,]