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

4

我正在尝试通过循环创建点模式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

我想做的是选择每个月的数据并创建一个 ppp.object。
> sort(unique(OT1$month))
[1]  7  8  9 10 11 12

以下循环可以正常运行,并且我可以看到每一个图像:
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)
}

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

请不要在r-help和这里之间交叉发布。这会带来不好的结果。 - Dirk Eddelbuettel
2
@DirkEddelbuettel - 为什么不呢?难道每个经常浏览[R]标签的人都是R-help的追随者吗?在我看来,这似乎是两个完全不同的社区。 - eykanal
@eykanal 我愿意打赌,几乎每个在SO上经常使用R标签的人都会潜伏在R-help上。 - joran
1
是的,但并不是所有寻求R帮助的人都会在这里和R-help中都进行搜索。我不确定我是否同意所提议的限制。 - eykanal
3
对我来说,这更多是关于礼貌。在这里或R-help上寻求帮助本质上就是要求忙碌的人们花时间免费帮助你。如果这些社区中的共识是反对交叉张贴(根据它们的常见问题解答是这样的),那么尊重这一点就是礼貌的表现。 - joran
@joran - 对不起,如果我冒犯了这里的任何人,我没有意识到跨帖子发布在社区中是被视为这样的(直到现在都没有听说过)。 - GodinA
3个回答

9

这似乎是使用lapply的好选择:

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

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

你需要创建一个要分配的列表。并且为了提高性能,始终建议创建正确长度的列表:

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)
}

谢谢你Tommy!我一直在苦苦思考如何编写列表函数!这个完美地解决了我的问题。 - GodinA

2
以下翻译是否符合您的要求?

以下内容是否适合您?

library(plyr)
dlply(OT1, .(month), function(a) ppp(a$longitude,a$latitude,marks=a$fTSUM))

1

首先,您应该创建一个正确长度的空列表,然后依次将每个ppp对象分配到该列表中的一个插槽中。

ind <- sort(unique(OT1$month))
b <- vector("list", length(ind))
for(i in 1:length(ind)){ 
    a <- OT1[OT1$month == ind[i],]
    b[[i]] <- ppp(a$longitude,a$latitude,marks=a$fTSUM,window=newW)
    plot(b[[i]],main=ind[i])
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接