биннинг широты петли в R - PullRequest
       20

биннинг широты петли в R

1 голос
/ 23 сентября 2019

Я новичок в использовании R, и у меня возникли некоторые проблемы с созданием цикла.

У меня есть фрейм данных почасовых данных за 2017–2019 годы, и у них есть координаты широты и долготы в градусах, наряду с другимиколонны.Широта в обоих отрицательных и положительных значениях охватывает полушария - от -90 до +90.Я хочу создать цикл, который разделяет их на 5-градусные полосы широты (например, от -45 до -40), а затем выводит их в отдельные таблицы.

В настоящее время я использую следующий код для разделения исходного кадра данных hourly.avg.bylat на отдельные кадры данных, то есть lat.bin.neg90_neg85, которые я хотел бы записать в виде таблиц, однако я считаю, что это довольно громоздко и отнимает много времении предпочел бы использовать цикл для этого.

lat.bin.neg90_neg85<-as.data.frame(split.data.frame(hourly.avg.bylat, cut(hourly.avg.bylat$lat, c(-90, -85), include.lowest=TRUE, labels = "")))

Я понимаю, что мог бы использовать for(i in seq(-90, 90, 5)), но немного растерялся относительно того, как связать все это вместе.

1 Ответ

1 голос
/ 23 сентября 2019

Вы можете использовать список, чтобы сохранить выходные данные и выполнить вычисления в цикле:

output=list()
for(i in seq(-90, 85, 5))
{
  output[[paste0(i,"_",i+5)]]<-as.data.frame(split.data.frame(hourly.avg.bylat,
                               cut(hourly.avg.bylat$lat, c(i, i+5),
                               include.lowest=TRUE, labels = "")))
}

Затем вы можете получить доступ к каждой ячейке, например, с помощью output[["-90_-85"]]

paste0(i,"_",i+5)строка для ключа списка.Обратите внимание, что цикл останавливается на 85, потому что мы сокращаемся между i и i+5, поэтому мы не хотим переходить между 90 и 95. Поскольку вы не предоставили необработанные данные, я не могу их протестировать, позвольте мнезнать, если есть проблема.

РЕДАКТИРОВАТЬ

Как предложено DaveT, это можно сделать в одной строке, используя:

split(hourly.avg.bylat, cut((hourly.avg.bylat$lat, breaks=seq(-90, 90, 5)))

...