【问题标题】:Create a list object in a loop in R在R中的循环中创建一个列表对象
【发布时间】:2012-03-09 15:42:04
【问题描述】:

我正在尝试在循环中创建点模式 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 和此处之间进行交叉发布。恶业。
  • @DirkEddelbuettel - 为什么不呢?经常来这里打[R]标签的都是R-help的关注者吗?对我来说,这似乎是两个完全不同的社区。​​span>
  • @eykanal 我敢打赌,几乎每一个经常出现在 SO 上的 R 标签至少都潜伏在 R-help 上。
  • 是的,但并非所有寻求 R 帮助的人都会在此处和 R-help 中搜索。我不确定我是否同意建议的限制。
  • @eykanal 对我来说,更简单的是礼貌。在这里或 R-help 上寻求帮助本质上是要求忙碌的人们抽出时间免费帮助您。如果这些社区之间的共识是不鼓励交叉发帖(他们的常见问题解答中给出了),那么尊重这一点只是礼貌。

标签: r loops


【解决方案1】:

这似乎很适合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)
}

【讨论】:

  • 谢谢你,汤米!我一直在为如何编写列表函数而苦苦挣扎!这非常有效。
【解决方案2】:

以下内容对你有用吗?

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

【讨论】:

  • 感谢@jmsigner 的建议。
【解决方案3】:

您应该先创建一个正确长度的空列表,然后将每个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])
}

【讨论】:

  • 感谢@joran 的建议。
猜你喜欢
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
相关资源
最近更新 更多