在R中的循环中创建一个列表对象

God*_*inA 2 loops r

我正在尝试在循环中创建点模式列表ppp.object {spatstat}.我的数据集如下所示:

> names(OT1);head(OT1);dim(OT1)
[1] "EID"       "latitude"  "longitude" "month"     "year"      "CPUE"      "TSUM"     
[8] "fTSUM"    
                EID latitude longitude month year CPUE TSUM fTSUM
1   167-1-1996-1135 67.70000 -61.81667     9 1996    0    0     F
2  167-10-1996-1135 67.71667 -59.18333     9 1996    0    0     F
3 167-100-1996-1135 67.86667 -59.43333    10 1996    0    0     F
4 167-101-1996-1135 67.95000 -59.58333    10 1996    0    0     F
5 167-102-1996-1135 68.10000 -59.76667    10 1996    0    0     F
6 167-103-1996-1135 67.81667 -59.38333    10 1996    0    0     F
[1] 2707    8
Run Code Online (Sandbox Code Playgroud)

我想做的是为我的每个月选择数据并创建一个ppp.object.

> sort(unique(OT1$month))
[1]  7  8  9 10 11 12
Run Code Online (Sandbox Code Playgroud)

以下循环有效,我可以看到我的每个数字:

for(i in sort(unique(OT1$month))){ 
  a<-OT1[OT1$month==i,]
  b<-ppp(a$longitude,a$latitude,marks=a$fTSUM,window=newW)
  plot(b,main=i)
}
Run Code Online (Sandbox Code Playgroud)

我想创建一个我可以单独访问的所有ppp.object的列表,我已尝试在循环命令中添加list()但没有任何成功...任何帮助将不胜感激!

谢谢!

Tom*_*mmy 8

这似乎非常适合lapply:

pppList <- lapply(sort(unique(OT1$month)), function(i) {
  a<-OT1[OT1$month==i,]
  ppp(a$longitude,a$latitude,marks=a$fTSUM,window=newW)
})
Run Code Online (Sandbox Code Playgroud)

...但只是为了解释如何修复你的循环:

您需要有一个要分配的列表.创建一个正确的长度始终是一个好主意:

x <- sort(unique(OT1$month))
pppList <- vector('list', length(x))
for(i in x) { 
  a<-OT1[OT1$month==i,]
  b<-ppp(a$longitude,a$latitude,marks=a$fTSUM,window=newW)
  pppList[[i]] <- b
  plot(b,main=i)
}
Run Code Online (Sandbox Code Playgroud)