Создать список объектов в цикле в R - PullRequest
2 голосов
/ 09 марта 2012

Я пытаюсь создать список точечных паттернов 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 () в команду loopно без успеха ... Любая помощь будет высоко ценится!

Спасибо!

Ответы [ 3 ]

8 голосов
/ 09 марта 2012

Похоже, это хорошо подходит для 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 голосов
/ 09 марта 2012

Подойдет ли вам следующее?

library(plyr)
dlply(OT1, .(month), function(a) ppp(a$longitude,a$latitude,marks=a$fTSUM))
1 голос
/ 09 марта 2012

Сначала вы должны создать пустой список правильной длины, а затем по очереди назначить каждому объекту 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])
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...