Мне нужно прочитать большое количество .asc-файлов, удалить строки и преобразовать их в растровый стек на stack()
. Источник zip-упакованных данных находится здесь: ftp://ftp.dwd.de/pub/CDC/grids_germany/monthly/radiation_global/ Я уже распаковал файлы. Но теперь я написал код, который очень медленно, мой компьютер не может осуществить это:Прочтите большое количество .asc-файлов, удалите строки и сохраните их как растровые в R
files <- list.files("mydirectory", pattern="\\.asc$",
full.names=TRUE, recursive=TRUE)
i <- lapply(files, readLines) #read data
i <- lapply(i, function(x){x[-(1:28)]}) #delete rows
i <- lapply(i, function(x){gsub('-999', ' NA ', x, fixed = TRUE)}) #convert '-999' to NA
i <- lapply(i, function(x){scan(textConnection(x), what = double(), n = 866*654)}) #convert to numeric
i <- lapply(i, function(x){matrix(x, nrow = 866, ncol = 654, byrow = TRUE)}) #convert to matrix
r <- lapply(i, function(x){raster(x)}) #rasterize data
st <- stack(r) #convert to stack-raster
Интересно, если есть лучший способ, чтобы преобразовать эти данные в растровые файлы. Другие файлы .asc имеют только 6 строк в виде заголовка, как здесь: ftp://ftp.dwd.de/pub/CDC/grids_germany/monthly/precipitation/01_Jan/. Я читал, что данные по более простой функции, которые используют только stack()
-функции:
loadRaster <- function(directory, output, clipping){
files <- list.files(path=directory, pattern="\\.asc$",
full.names=TRUE, recursive=TRUE)
stc <- stack(files)
crs(stc) <- gk3
stcC <- crop(stc, extent(clipping))
writeRaster(stcC, filename=output)
}
#You can ignore the code below "stc <-stack(files)"
Вы говорите, что это медленно, но где узкое место? Добавьте 'system.time()' ко всему вашему 'lapply', чтобы увидеть проблемный. Это поможет нам указать нашу помощь. Кроме того, lapply часто может ускоряться, просто распараллеливаясь с 'library (parallel)' и функцией 'parLapply'. это может помочь. – Bastien