如何为数据框中的每个唯一值创建多个栅格?
How do I create multiple rasters for each unique value in a dataframe?
我有一个包含纬度、经度、物种名称的数据框,iucn_status、class,如下所示...
`1 -0.25 -80.75 Axoclinus cocoensis VU Actinopterygii
2 -0.75 -80.75 Axoclinus cocoensis VU Actinopterygii
3 -8.75 -172.25 Axoclinus cocoensis VU Actinopterygii
4 -9.25 -171.25 Axoclinus cocoensis VU Actinopterygii
5 -9.25 -171.75 Axoclinus cocoensis VU Actinopterygii
6 -13.75 -171.25 Axoclinus cocoensis VU Actinopterygii` #3,500,000 rows total
我想做的是为包含其分布的每个物种创建一个栅格(上面 d.f 包含 516 个物种),然后 convert/export 每个栅格作为 ASCII (.asc) 文件.我有一些代码,但似乎无法正确地将它们合在一起...
`ids=unique(aqua_trim$Species) #I want to name each raster the species name
all_rasters <- list()
all_dfs <- list()
for (i in ids){
loopraster <- tempraster #tempraster is the empty raster of desired extent and resolution
tablepoints<-table(cellFromXY(tempraster, subset(aqua_trim, id==i)))
dfpoints<-as.data.frame(tablepoints)
dfpoints$Freq<-dfpoints$Freq/sum(dfpoints$Freq)
loopraster[as.numeric(names(tablepoints))]<-tablepoints
all_rasters[[i]] <- loopraster
all_dfs[[i]] <- dfpoints
print(i)
}`
上面创建了一个栅格列表,但是它们都是空的,编辑后,现在报错,Error in id == i :
comparison (1) is possible only for atomic and list types
以前的问题和我正在尝试改编的代码:
我不会在这里列出我所做的所有尝试或错误,但我们将不胜感激任何帮助。
这是一个最小的独立的、可重现的例子。
示例数据
library(raster)
r <- raster(system.file("external/rlogo.grd", package="raster"))
r <- aggregate(raster(r), 15) # empty raster of desired properties
xy <- matrix(c(48, 48, 48, 53, 50, 46, 54, 70, 84, 85, 74, 84, 95, 85,
66, 42, 26, 4, 19, 17, 7, 14, 26, 29, 39, 45, 51, 56, 46, 38, 31,
22, 34, 60, 70, 73, 63, 46, 43, 28), ncol=2)
制作一个包含每个像元观测值数量的栅格
rsp <- rasterize(xy, r, fun="count")
接下来我将展示如何在循环中执行此操作。先创建三个物种
spdata <- rbind(data.frame(sp = "bird", xy),
data.frame(sp="mammal", xy / 2),
data.frame(sp="lizard", sqrt(xy)))
继续循环。首先获取物种名称并为结果创建一个空列表。然后遍历物种名称。
spp <- unique(spdata$sp)
result <- list()
for (i in 1:length(spp)) {
# get the coordinates for species i
spi <- spdata[spdata$sp == spp[i], 2:3]
result[[i]] <- rasterize(spi, r, fun="count")
}
看看
s <- stack(result)
plot(s)
要为每个物种保存一个文件,您可以像这样更改循环,这里使用请求的 ascii 格式
for (i in 1:length(spp)) {
spi <- spdata[spdata$sp == spp[i], ]
fname <- paste0(spp[i], ".asc")
x <- rasterize(spi[,2:3], r, fun="count", filename=fname)
}
我有一个包含纬度、经度、物种名称的数据框,iucn_status、class,如下所示...
`1 -0.25 -80.75 Axoclinus cocoensis VU Actinopterygii
2 -0.75 -80.75 Axoclinus cocoensis VU Actinopterygii
3 -8.75 -172.25 Axoclinus cocoensis VU Actinopterygii
4 -9.25 -171.25 Axoclinus cocoensis VU Actinopterygii
5 -9.25 -171.75 Axoclinus cocoensis VU Actinopterygii
6 -13.75 -171.25 Axoclinus cocoensis VU Actinopterygii` #3,500,000 rows total
我想做的是为包含其分布的每个物种创建一个栅格(上面 d.f 包含 516 个物种),然后 convert/export 每个栅格作为 ASCII (.asc) 文件.我有一些代码,但似乎无法正确地将它们合在一起...
`ids=unique(aqua_trim$Species) #I want to name each raster the species name
all_rasters <- list()
all_dfs <- list()
for (i in ids){
loopraster <- tempraster #tempraster is the empty raster of desired extent and resolution
tablepoints<-table(cellFromXY(tempraster, subset(aqua_trim, id==i)))
dfpoints<-as.data.frame(tablepoints)
dfpoints$Freq<-dfpoints$Freq/sum(dfpoints$Freq)
loopraster[as.numeric(names(tablepoints))]<-tablepoints
all_rasters[[i]] <- loopraster
all_dfs[[i]] <- dfpoints
print(i)
}`
上面创建了一个栅格列表,但是它们都是空的,编辑后,现在报错,Error in id == i :
comparison (1) is possible only for atomic and list types
以前的问题和我正在尝试改编的代码:
我不会在这里列出我所做的所有尝试或错误,但我们将不胜感激任何帮助。
这是一个最小的独立的、可重现的例子。
示例数据
library(raster)
r <- raster(system.file("external/rlogo.grd", package="raster"))
r <- aggregate(raster(r), 15) # empty raster of desired properties
xy <- matrix(c(48, 48, 48, 53, 50, 46, 54, 70, 84, 85, 74, 84, 95, 85,
66, 42, 26, 4, 19, 17, 7, 14, 26, 29, 39, 45, 51, 56, 46, 38, 31,
22, 34, 60, 70, 73, 63, 46, 43, 28), ncol=2)
制作一个包含每个像元观测值数量的栅格
rsp <- rasterize(xy, r, fun="count")
接下来我将展示如何在循环中执行此操作。先创建三个物种
spdata <- rbind(data.frame(sp = "bird", xy),
data.frame(sp="mammal", xy / 2),
data.frame(sp="lizard", sqrt(xy)))
继续循环。首先获取物种名称并为结果创建一个空列表。然后遍历物种名称。
spp <- unique(spdata$sp)
result <- list()
for (i in 1:length(spp)) {
# get the coordinates for species i
spi <- spdata[spdata$sp == spp[i], 2:3]
result[[i]] <- rasterize(spi, r, fun="count")
}
看看
s <- stack(result)
plot(s)
要为每个物种保存一个文件,您可以像这样更改循环,这里使用请求的 ascii 格式
for (i in 1:length(spp)) {
spi <- spdata[spdata$sp == spp[i], ]
fname <- paste0(spp[i], ".asc")
x <- rasterize(spi[,2:3], r, fun="count", filename=fname)
}