2016-03-15 49 views
3

我的最終目標是使用包spatstat來計算數據幀列表的Clark-Evans-Index(clarkevans.test)。使用lapply創建ppp對象(包spatstat)

所以,我有我的觀點的數據列表:

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 

和劇情的座標列表:

ref.li <- list(structure(list(x.ref = c(-51.957519, -44.640527, 24.976003, 
17.659011), y.ref = c(39.756418, -29.860112, -22.54312, 47.07341 
)), class = "data.frame", row.names = c(NA, -4L), .Names = c("x.ref", 
"y.ref")), structure(list(x.ref = c(15.613798, -52.306902, -35.372372, 
32.548328), y.ref = c(40.306747, 23.372217, -44.548483, -27.613953 
)), class = "data.frame", row.names = c(NA, -4L), .Names = c("x.ref", 
"y.ref"))) 

> ref.li 
[[1]] 
     x.ref  y.ref 
1 -51.95752 39.75642 
2 -44.64053 -29.86011 
3 24.97600 -22.54312 
4 17.65901 47.07341 

[[2]] 
     x.ref  y.ref 
1 15.61380 40.30675 
2 -52.30690 23.37222 
3 -35.37237 -44.54848 
4 32.54833 -27.61395 

我創建owin對象的列表:

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 

現在我想創建ppp對象:

pattern.li <- lapply(points.li, function(x) {ppp(x$x.n, x$y.n, window=bound.li)}) 

導致:

Error in verifyclass(window, "owin") : 
    argument ‘window’ is not of class ‘owin’ 

如果問題是使用owin對象列表或我的不正確使用lapply與PPP功能我需要參考兩個列表我不知道在這裏,但不知道如何。任何提示如何解決這個問題?

編輯)我也試過

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

,但不返回PPP對象的列表..

+1

一旦你使用下面的解決方案之一你可能想要將spatstat類'solist'(空間對象列表)添加到結果中(假設你命名列表'pattern.li'):'pattern.li < - as.solist(pattern.li)'。例如,當您繪製點模式的整個列表時,它會自動爲您製作佈局:'plot(pattern.li)'。 –

+0

@EgeRubak謝謝,這非常有趣和有用! – beetroot

回答

5

owin對象的整個列表傳遞給window參數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 
3

你最後的建議幾乎工作。你只需要參數SIMPLIFY = FALSE

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

另外,您可以爲您的點座標data.frameWX調用函數as.ppp爲您owin對象:

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

@ pierre-lafortune使用'Map'的方法在函數式編程的精神上似乎更現代化,所以我也提出了這個建議。實際上看起來R中的Map只是一個避免簡化參數的「mapply」包裝,所以你真的走在了正確的軌道上。 –