2016-10-14 4 views
0

はのは、私は、各セルで発生するユニークなカテゴリの数に基づいてラスター地図を作成するための最良の方法だろう何ユニークな値からラスタを作成するには?

 
category longitude latitude 
a   -83.7  26.2 
b   -83.7  26.2 
b   -84.6  26.2 
c   -82.4  25.7 
a   -80.1  27.7 
b   -75.9  34.5 

のように見えるのデータフレームがあるとしましょうか?

地理空間データに慣れているわけではありませんが、私は以下のアプローチを使用しています。しかし、より良い/より速い解決策があるかもしれません。

library(raster) 
library(ggplot2) 
foo <- structure(list(category = c("a", "b", "b", "c", "a", "b"), 
       longitude = c(-83.7, -83.7, -84.6, -82.4, -80.1, -75.9), 
       latitude = c(26.2, 26.2, 26.2, 25.7, 27.7, 34.5)), 
       .Names = c("category", "longitude", "latitude"), 
       class = "data.frame", 
       row.names = c(NA, -6L)) 
split_foo <- split(foo, foo$category) 
us_raster <- raster(xmn = -127, ymn = 23, xmx = -61, ymx = 50, res = 1) 
raster_lst <- lapply(split_foo, function(x) { 
    pts <- SpatialPoints(data.frame(lon = foo$longitude, lat = foo$latitude)) 
    rasterize(pts, us_raster, fun="count") 
}) 
raster_foo <- Reduce("merge", raster_lst) 
gg_foo <- as.data.frame(as(raster_foo, "SpatialPixelsDataFrame")) 
colnames(gg_foo) <- c("value", "x", "y") 
ggplot() + 
    geom_raster(data = gg_foo, aes(x = x, y = y, fill = value)) + 
    coord_quickmap() 

output

答えて

1

ここでも大規模なデータに高速である必要があります方法です。

ここではデータテーブルの表記法を使用しますが、必要に応じてベースRまたはdplyr表記でも同様に行うことができます。

library(data.table) 
dt = data.table(foo) 
r = raster(vals=0, xmn=-85, xmx=-75, ymn=25, ymx=35, res=1) 

# add a new column to dt specifying which raster cell each row is in 
dt[, rastercell := cellFromXY(r, .SD[,.(longitude, latitude)])] 
# aggregate how many unique categories there are in each raster cell 
dt.tab <- dt[, length(unique(category)), by = rastercell] 
# update the values of the raster with these values 
r[dt.tab[, rastercell]] <- dt.tab[, V1] 
# and plot 
plot(r) 

enter image description here

ベースRの表記で同じことは、場合にあなたが好む:

r = raster(vals=0, xmn=-85, xmx=-75, ymn=25, ymx=35, res=1) 
foo$rastercell <- cellFromXY(r, foo[,2:3]) 
foo.tab <- aggregate(category~rastercell, data=foo, FUN=function(x) length(unique(x))) 
r[foo.tab[, "rastercell"]] <- foo.tab[, "category"] 
plot(r) 
関連する問題