R: извлечь широту из растра

Как извлечь или разделить растровый объект на одну строку данных? У меня есть растр данных о глобальной температуре, и я хочу рассчитать среднемесячное значение за год для каждой долготы / столбца.

library(ncdf4)
library(raster)

download.file("http://www.cru.uea.ac.uk/cru/data/temperature/CRUTEM.4.3.0.0.anomalies.nc"
              , destfile="CRUTEM.4.3.0.0.anomalies.nc", mode="wb")

cru.tmp <-  stack("CRUTEM.4.3.0.0.anomalies.nc")

# inspect elements
cru.tmp

# list all years
names(cru.tmp)

# plot a single year
plot(cru.tmp$X2008.01.16)

# find nrow for 67.5deg North
mylat <- rowFromY(cru.tmp, 67.5)

# extract the row
cru.tmp.67.5N <- getValuesBlock(test, row=mylat, nrows=1)

Итак, в основном я хочу, чтобы для каждой из 72 оставшихся ячеек сетки было 12 ежемесячных средних значений.


person Joanne Demmler    schedule 15.10.2014    source источник
comment
Возможно, преобразовать каждый растровый слой в матрицу (например, as.matrix(cru.tmp$X1850.01.16)), чтобы упростить доступ к нужным вам данным? crop также может работать, но это может быть медленной операцией.   -  person hrbrmstr    schedule 15.10.2014
comment
Я на шаг дальше использую getValuesBlock   -  person Joanne Demmler    schedule 15.10.2014


Ответы (3)


Вы можете использовать базовую индексацию, чтобы получить одну строку или столбец.

library(raster)
b <- brick(system.file("external/rlogo.grd", package="raster"))
x4 <- b[,4]
person Robert Hijmans    schedule 17.05.2015

Данные уже находятся в cru.tmp.67.5N, но их нужно переупорядочить:

cru.tmp.67.5N_mean <- array(NA, c(72,12,165))

colnames(cru.tmp.67.5N_mean) <- c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", 
                    "Sep", "Oct", "Nov", "Dec")
rownames(cru.tmp.67.5N_mean) <- xFromCol(cru.tmp, col=1:ncol(cru.tmp))

for (i in 1:12){
  for (j in 1:72){
    for (k in 1:165){

    month <- seq(i,length(colnames(cru.tmp.67.5N)),12)
    cru.tmp.67.5N_mean[j,i,k] <- cru.tmp.67.5N[j,month[k]]
      }
   }
}
person Joanne Demmler    schedule 15.10.2014
comment
не совсем правильная логика, это среднее за все годы, а не за каждый год ... - person Joanne Demmler; 15.10.2014

Такую операцию легко выполнить из командной строки с помощью cdo:

cdo monmean -zonmean CRUTEM.4.3.0.0.anomalies.nc  monzonmean.nc

Zonmean вычисляет зональное среднее значение, которое затем передается команде monmean. Это для всех лет, но если вам нужен конкретный год, вы можете использовать команду selyear, например:

cdo monmean -zonmean -selyear,2008 CRUTEM.4.3.0.0.anomalies.nc  monzonmean2008.nc
person Adrian Tompkins    schedule 16.04.2018