R 使用Lappy创建ppp对象(package spatstat)

R 使用Lappy创建ppp对象(package spatstat),r,lapply,spatstat,R,Lapply,Spatstat,我的最终目标是使用spatstat包计算数据帧列表的Clark Evans索引(clarkevans.test) 因此,我有一个点数据列表: points.li <- list(structure(list(x.n = c(-1.37977544977995, 0.0787053126116266, -6.50583075192879, -9.17021249875416, -19.4146851390704, -22.7380870106472, -20.3267566111816,

我的最终目标是使用spatstat包计算数据帧列表的Clark Evans索引(
clarkevans.test

因此,我有一个点数据列表:

points.li <- list(structure(list(x.n = c(-1.37977544977995, 0.0787053126116266, 
-6.50583075192879, -9.17021249875416, -19.4146851390704, -22.7380870106472, 
-20.3267566111816, -15.7328116296655, -8.74750043303314, -11.8963575795747
), y.n = c(13.1276911114957, 2.22311850078447, 9.48873515598742, 
2.7986686485412, 2.56632386092958, -0.757078010647191, 6.88269379207495, 
11.5304629645448, 19.131978467755, 28.8757897612883)), row.names = 1098:1107, class = "data.frame", .Names = c("x.n", 
"y.n")), structure(list(x.n = c(0.104714438623701, 1.93357872460516, 
1.51117985822383, 4.47756948027361, 0.710996014054978, -0.727469791776916, 
0.694499984379773, 2.88088318987335, -5.90066975026119, -11.3699018974284
), y.n = c(-5.99908617093835, -9.09677268682439, -12.3075722803524, 
-16.7105167948009, -16.2844860117843, -13.8809505330886, -19.88787745768, 
-20.4985490229505, -14.9797228445106, -17.1780479345837)), row.names = 108:117, class = "data.frame", .Names = c("x.n", 
"y.n")))

> points.li
[[1]]
              x.n       y.n
1098  -1.37977545 13.127691
1099   0.07870531  2.223119
1100  -6.50583075  9.488735
1101  -9.17021250  2.798669
1102 -19.41468514  2.566324
1103 -22.73808701 -0.757078
1104 -20.32675661  6.882694
1105 -15.73281163 11.530463
1106  -8.74750043 19.131978
1107 -11.89635758 28.875790

[[2]]
            x.n        y.n
108   0.1047144  -5.999086
109   1.9335787  -9.096773
110   1.5111799 -12.307572
111   4.4775695 -16.710517
112   0.7109960 -16.284486
113  -0.7274698 -13.880951
114   0.6945000 -19.887877
115   2.8808832 -20.498549
116  -5.9006698 -14.979723
117 -11.3699019 -17.178048
现在我想创建
ppp
对象:

library(spatstat)
bound.li <- lapply(ref.li, function(x) {owin(poly = list(x = x$x.ref, y = x$y.ref))})

> bound.li
[[1]]
window: polygonal boundary
enclosing rectangle: [-51.95752, 24.976] x [-29.86011, 47.07341] units

[[2]]
window: polygonal boundary
enclosing rectangle: [-52.3069, 32.54833] x [-44.54848, 40.30675] units
pattern.li <- lapply(points.li, function(x) {ppp(x$x.n, x$y.n, window=bound.li)})
我不知道问题是否出在使用owin对象列表,或者我在ppp函数中不正确地使用了lappy,因为我需要在这里参考两个列表,但不知道如何使用。有什么提示可以解决这个问题吗

(编辑)我也试过了

mapply(function(x, y) {ppp(x$x.n, x$y.n, window=y)}, x=points.li, y=bound.li)

但这不会返回ppp对象列表。

您正在将整个
owin
对象列表传递到
ppp
中的
窗口
参数。您可以使用
Map
同时迭代两个列表。当您尝试
mapply
时,它会自动简化结果。您还可以使用
SIMPLIFY=FALSE
参数作为
mapply

Map(function(x, y) {ppp(x$x.n, x$y.n, window=y)}, x=points.li, y=bound.li)
#[[1]]
#Planar point pattern: 10 points
#window: polygonal boundary
#enclosing rectangle: [-51.95752, 24.976] x [-29.86011, 47.07341] units
#
#[[2]]
#Planar point pattern: 10 points
#window: polygonal boundary
#enclosing rectangle: [-52.3069, 32.54833] x [-44.54848, 40.30675] units

你最后的建议几乎奏效了。您只需要参数
SIMPLIFY=FALSE

mapply(function(x, y) {ppp(x$x.n, x$y.n, window=y)}, x=points.li, y=bound.li, SIMPLIFY = FALSE)
或者,您可以调用函数
as.ppp
,将
X
作为点坐标的
data.frame
,将
W
作为
owin
对象:

mapply(as.ppp, X = points.li, W = bound.li, SIMPLIFY = FALSE)

@pierre lafortune使用
Map
的方法在函数式编程的精神上似乎更加现代,因此我也对其进行了改进。实际上,R中的
Map
似乎只是
mapply
的包装,避免了simplify参数,因此您的思路是正确的。使用以下解决方案之一后,您可能希望将spatstat类
solist
(空间对象列表)添加到结果中(假设您将列表命名为
pattern.li
):
pattern.li@EgeRubak谢谢,这很有趣也很有用!
mapply(function(x, y) {ppp(x$x.n, x$y.n, window=y)}, x=points.li, y=bound.li, SIMPLIFY = FALSE)
mapply(as.ppp, X = points.li, W = bound.li, SIMPLIFY = FALSE)