R, как сложить элементы вектора шаг за шагом? - PullRequest
0 голосов
/ 12 марта 2019

Что касается временных рядов пространственных данных, которые я изучаю в R, у меня есть вопрос, с которым вы могли бы мне помочь!

Я получил огромное количество ежедневных данных (за 2001–2015 годы = 14061 слой). Теперь я хочу вычислить среднее значение в год на пиксель и сохранить результат в слое (результат должен быть растровым стеком из 15 слоев, по одному в год). Проблема в том, что мне приходится включать високосные годы в учебу ...

Что я получил до сих пор, так это:

ts_years <- seq.Date(as.Date("2001/01/01"), as.Date("2015/01/01"), by = "year")
# create a vector with 15 elements for 15 years

ts_years_length <- sapply(ts_years, yearDays)
# calculate number of days for the specific years

ts_years_length
[1] 365 365 365 366 365 365 365 366 365 365 365 366 365 365 365

Теперь я хочу вычислить индекс - чтобы преследовать начало и конец каждого года в моем растровом стеке - чтобы построить среднее значение для каждого года с помощью этого. Поэтому я должен выяснить, как решить следующую проблему:

year_2001 <- rasterstack[[1:365]]
year_2002 <- rasterstack[[366:731]]
year_2003 <- rasterstack[[732:1097]]
# ...and so on

Для этого мне нужно сложить созданный вектор следующим образом:

ts_years_length_index <- c(1, ts_years_length[1],
                           ts_years_length[1] + 1, ts_years_length[1] + 1 + ts_years_length[2])
# ...and so on

Но так как это действительно боль в а **, было бы неплохо сделать это автоматически. У вас есть предложения?

Большое спасибо за вашу помощь заранее!

Ответы [ 2 ]

2 голосов
/ 12 марта 2019

Вот как вы можете это сделать. (1) создать индекс группировки и (2) использовать этот индекс в stackApply

idx <- rep(1:length(ts_years_length), ts_years_length)
r <- stackApply(rasterstack, idx, mean)

См. ?raster::stackApply для примера с данными

0 голосов
/ 12 марта 2019

Вы можете попробовать это:

require(lubridate)
ts_years <- seq.Date(as.Date("2001/01/01"), as.Date("2015/12/31"), by = "day")
lst<-list()
for (i in 2001:2015) lst[[as.character(i)]]<-which(year(ts_years)==i)
yearraster<-list()
for (i in 2001:2015) yearraster[[as.character(i)]]<-rasterstack[[lst[[as.character(i)]]]]

Вместо того, чтобы вычислять количество дней в каждом году вручную, это создает вектор всех дней в вашем периоде времени, а затем создает список, где каждый элементявляется вектором индексов всех дней в этом году.Затем вы можете использовать этот список индексов в качестве индекса для вызова растрового стека и поместить каждый результат растрового стека в элемент второго списка.

...