有没有办法在 R 中使用 spatstat 创建 ppp 对象列表?

Is there a way to create a list of ppp objects using spatstat in R?

我正在尝试创建景观对象列表,这些对象已根据名为 sim 的变量进行分组。理想情况下,我想要一个包含景观对象的列表,可以称为


[[1]]

Planar point pattern: 100 points
window: rectangle = [0, 1000] x [0, 1000] units

[[2]]

Planar point pattern: 100 points
window: rectangle = [0, 1000] x [0, 1000] units

到目前为止我试过的代码是这样的:


library(tidyr)
library(spatstat)

set.seed(23)

x<-runif(1000)*1000
y<-runif(1000)*1000
sim<-rep(1:10,100)

coordinates<-data.frame(x,y,sim)

coordinates<-coordinates[order(sim),]

emptylist<-vector(mode="list",length=10)
metriccalculation<-function(x,y){
  emptylist<-ppp(x,y,owin(xrange=c(0,1000),yrange=c(0,1000)))
}

coordinates%>%group_by(sim)%>%lapply(coordinates,function(x)metriccalculation(coordinates$x,coordinates$y))

这个returns错误:

Error in get(as.character(FUN), mode = "function", envir = envir) : 
  object 'coordinates' of mode 'function' was not found

编辑 1:我尝试在 metriccalculation 函数中添加 emptylist 作为变量,返回相同的错误。

metriccalculation<-function(x,y,r){
  r<-ppp(x,y,owin(xrange=c(0,1000),yrange=c(0,1000)))
}

coordinates%>%group_by(sim)%>%lapply(coordinates,function(x)metriccalculation(coordinates$x,coordinates$y,emptylist))

编辑 2:我尝试向函数添加一个附加项,以便填充列表。这也返回了同样的错误。

emptylist<-vector(mode="list",length=10)
metriccalculation<-function(x,y,r){
  r<-append(r,(ppp(x,y,owin(xrange=c(0,1000),yrange=c(0,1000)))))
}

coordinates%>%group_by(sim)%>%lapply(coordinates,function(x)metriccalculation(coordinates$x,coordinates$y,emptylist))

编辑 3:

好的,我在网上查了一下,有一种方法可以通过应用函数传递多个变量。这导致:

coordinates%>%group_by(sim)%>%apply(coordinates,metriccalculation,x=coordinates$x,y=coordinates$y,r=emptylist)

还有一个新错误,

Error in d[-MARGIN] : invalid subscript type 'list'

如果你真的只需要一个包含 10 个点模式和 100 个均匀随机数的列表 你可以做的事情:

library(spatstat)
rslt <- runifpoint(100, win = square(1000), nsim = 10)
rslt # Is a list with extra spatstat class `solist` (spatial object list)
#> List of point patterns
#> 
#> Simulation 1:
#> Planar point pattern: 100 points
#> window: rectangle = [0, 1000] x [0, 1000] units
#> 
#> Simulation 2:
#> Planar point pattern: 100 points
#> window: rectangle = [0, 1000] x [0, 1000] units
#> 
#> Simulation 3:
#> Planar point pattern: 100 points
#> window: rectangle = [0, 1000] x [0, 1000] units
#> 
#> Simulation 4:
#> Planar point pattern: 100 points
#> window: rectangle = [0, 1000] x [0, 1000] units
#> 
#> Simulation 5:
#> Planar point pattern: 100 points
#> window: rectangle = [0, 1000] x [0, 1000] units
#> 
#> Simulation 6:
#> Planar point pattern: 100 points
#> window: rectangle = [0, 1000] x [0, 1000] units
#> 
#> Simulation 7:
#> Planar point pattern: 100 points
#> window: rectangle = [0, 1000] x [0, 1000] units
#> 
#> Simulation 8:
#> Planar point pattern: 100 points
#> window: rectangle = [0, 1000] x [0, 1000] units
#> 
#> Simulation 9:
#> Planar point pattern: 100 points
#> window: rectangle = [0, 1000] x [0, 1000] units
#> 
#> Simulation 10:
#> Planar point pattern: 100 points
#> window: rectangle = [0, 1000] x [0, 1000] units
plot(rslt)

如果你想把你的 data.frame 和坐标分成 10 个不同的 你可以做的点模式(重用你的代码):

set.seed(23)
x<-runif(1000)*1000
y<-runif(1000)*1000
sim<-rep(1:10,100)
coordinates<-data.frame(x,y,sim)
coord_list <- split(coordinates[,c("x", "y")], coordinates$sim)
rslt2 <- lapply(coord_list, as.ppp, W = square(1000))
rslt2 # Is a usual list
#> $`1`
#> Planar point pattern: 100 points
#> window: rectangle = [0, 1000] x [0, 1000] units
#> 
#> $`2`
#> Planar point pattern: 100 points
#> window: rectangle = [0, 1000] x [0, 1000] units
#> 
#> $`3`
#> Planar point pattern: 100 points
#> window: rectangle = [0, 1000] x [0, 1000] units
#> 
#> $`4`
#> Planar point pattern: 100 points
#> window: rectangle = [0, 1000] x [0, 1000] units
#> 
#> $`5`
#> Planar point pattern: 100 points
#> window: rectangle = [0, 1000] x [0, 1000] units
#> 
#> $`6`
#> Planar point pattern: 100 points
#> window: rectangle = [0, 1000] x [0, 1000] units
#> 
#> $`7`
#> Planar point pattern: 100 points
#> window: rectangle = [0, 1000] x [0, 1000] units
#> 
#> $`8`
#> Planar point pattern: 100 points
#> window: rectangle = [0, 1000] x [0, 1000] units
#> 
#> $`9`
#> Planar point pattern: 100 points
#> window: rectangle = [0, 1000] x [0, 1000] units
#> 
#> $`10`
#> Planar point pattern: 100 points
#> window: rectangle = [0, 1000] x [0, 1000] units
plot(as.solist(rslt2))