So I've created a file that reads into a data frame in the same way as yours:
> str(v2)
'data.frame': 360 obs. of 720 variables:
BUT data.frame isn't really the right thing here. Its really meant for record-oriented data, where each row is a record and each column is a potentially different variable for that record (eg each row is a person, the columns are name, age, height, etc).
So you really only need to scan
the data in as one long vector and feed it to a raster.
Step 1, define an empty raster of the right size and shape (note I'm assuming the raster covers the whole world, so the limits are not the cell centres):
> m2=raster(nrow=360,ncol=720,xmn=-180,xmx=180,ymn=-90,ymx=90)
Step 2, read numeric values into the raster data slot:
> m2[]=scan("d.txt",what=1)
Read 259200 items
And give it a projection if needed:
> projection(m2)="+init=epsg:4326"
> plot(m2)
If you want to check that the resolution and the cell centres are as expected, use these functions:
> res(m2)
[1] 0.5 0.5
> xFromCol(m2,1:10)
[1] -179.75 -179.25 -178.75 -178.25 -177.75 -177.25 -176.75 -176.25 -175.75
[10] -175.25
> yFromRow(m2,1:10)
[1] 89.75 89.25 88.75 88.25 87.75 87.25 86.75 86.25 85.75 85.25
which shows the resolution is half a degree and the cell centres (or at least the first 10) are at those specified coordinates.
Edit: adding some more stuff to make clearer, as per suggestion
#import the numpy and gdal libraries
import numpy as np
from osgeo import gdal
#an empty array/vector in which to store the different bands
layers = []
#open raster
ds = gdal.Open('raster.tif')
#loop thru bands of raster and append each band of data to 'layers'
#note that 'ReadAsArray()' returns a numpy array
for i in range(1, ds.RasterCount+1):
layers.append(ds.GetRasterBand(i).ReadAsArray())
#dstack will take a number of n by m in tuple or list and stack them
#in the 3rd dimension so you end up with raster_stack being n by m by i,
#where i is the number of bands
raster_stack = np.dstack(layers)
#call built in numpy functions std and mean, with a specified axis. if
#no axis is set then it will return a number (scaler) but specifying
#axis=2 means it will calculate along the 'depth' axis, per pixel.
#with the return being n by m, the shape of each band.
std_raster = np.std(raster_stack, axis=2)
mean_raster = np.mean(raster_stack, axis=2)
Best Answer
In this line:
it looks like you are trying to extract the values from a list of spatial points objects (
list.shape
). I can duplicate this error using the example objects fromhelp(extract)
:You need to loop over your spatial points in
list.shape
and extract each one individually. So you need a nested loop - an outer loop of rasters and an inner loop of spatial points. You can do this without needing afor
loop with anlapply
over a list of spatial points objects:then its your job to do whatever you need with that output to get it into the matrix or whatever dataframe you want as your final output.