2013-12-11 2 views
0

Im пытается перебрать папки в каталоге при чтении и назначении файлов переменным в R. Я знаю, что в этой теме уже много тем. Однако я не смог найти решение моей проблемы. Я новичок в R, так голый со мной, пожалуйста.зацикливание по папкам при выполнении задания

Файлы, которые я хочу назначить переменным, являются shapefiles, поэтому я использую функцию readOGR из пакета rgdal. Цель состоит в том, чтобы позже объединить все шейп-файлы, принадлежащие определенному виду. Иерархия/структура каталога: type1>species>ids. shapefiles выглядеть id.shp и т.д.

Пример шейп можно загрузить here и here

#code 
setwd("~/type1/") 

#Extract ids belonging to $species. Later use in readOCR function 

sp_id <- function(species){ 
wd = "~/type1/" 
list_shp <- list.files(path=paste(wd,species,sep='/'), full.names = F, recursive = F, include.dirs = F) 
vec <- character() 

    for (shp in list_shp){ 
    y <- unlist(strsplit(shp, '\\.', perl=T)) 
    vec <- unique(c(vec,y[1])) 
    } 

#"1905" "4279" 

#Extract dirs for where to perform readOCR function 

    list_dir <- list.dirs(path=paste(wd,species,sep='/'), full.names = F, recursive = F) 

    for (id in list_dir){ 
    setwd(id) 
    print(getwd()) 
    } 

#"~/type1/speciesX1/1905" 
#"~/type1/speciesX1/4279" 

    for (i in vec){ 
    assign(paste("", i, sep=""), readOGR(".", i)) 
    break 
    } 
} 

sp_id('speciesX1') 

[1] "~/type1/speciesX1/1905" 
OGR data source with driver: ESRI Shapefile 
Source: ".", layer: "1905" 
with 10 features and 3 fields 
Feature type: wkbPolygon with 2 dimensions 
[1] "~/type1/speciesX1/4279" 
Error in ogrInfo(dsn = dsn, layer = layer, encoding = encoding, use_iconv = use_iconv) : 
Cannot open layer 

Проблема заключается в том, что код выполняется только для readOGR один shapefile в одном из dirs, кажется, снова изменить реж но не выполняет последние readOGR.

Любые указатели будут высоко оценены.

ответ

2

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

library(rgdal) 

setwd("~/type1/") 
species <- 'speciesX1' 
list_shp <- list.files(path=species, pattern="*.shp", full.names = TRUE, 
         recursive = TRUE, include.dirs = FALSE) 
shp_objects <- lapply(list_shp, function(x) {readOGR(dsn=x, 
                layer=ogrListLayers(x))}) 

Это даст вам список SpatialPolygonDataframe объектов, которые затем можно объединить

+0

Удивительно, спасибо! Не забывайте чаще использовать функции «apply». Только для случая обучения, можете ли вы сказать мне, где моя функция нарушена? –

+0

1. Ваше имя функции 'sp_id' отличается от того, что вы вызываете позже (' sp_mrgid ('speciesX1') ') 2.' setwd (id) 'в строке 25 приведет к ошибке (насколько я видел это , вы никогда не устанавливаете wd в 'species', какие подпапки вы пытаетесь получить. Это были просто быстрое наблюдение, не пытались отлаживать его всерьез. – jlehtoma

+1

Вот [gist] (https: //gist.github .com/jlehtoma/7924643), демонстрируя слияние. – jlehtoma

0

Я не мог получить ogrInfo(), чтобы прочитать эти файлы, получившие ошибку в слое). Это обеспечило способ чтения и получения некоторых атрибутов. (A Mac будет принимать дублированные имена каталогов и добавить «(п)» для них, так что одинаково названные, но разные файлы были iho.zip и iho.zip:

library(sp) 

ca3 = readShapeSpatial("~/Downloads/iho/iho.shp") 
ca3 = readShapeSpatial("~/Downloads/iho(2)/iho.shp") 

> attributes(ca3)$data 
           name id mrgid 
0 Mediterranean Sea - Western Basin 28Aa 4279 
1    Strait of Gibraltar 28a 3346 
2      Alboran Sea 28b 3324 
3      Balearic Sea 28c 3322 
4      Ligurian Sea 28d 3363 
5     Tyrrhenian Sea 28e 3386 
> attributes(ca2)$data 
           name id mrgid 
0 Mediterranean Sea - Western Basin 28Aa 4279 
1 Mediterranean Sea - Eastern Basin 28Bb 4280 
2    Strait of Gibraltar 28a 3346 
3      Alboran Sea 28b 3324 
4      Balearic Sea 28c 3322 
5      Ligurian Sea 28d 3363 
6     Tyrrhenian Sea 28e 3386 
7      Adriatic Sea 28g 3314 
8      Ionian Sea 28f 3351 
9      Aegean Sea 28h 3315 
+0

Приветствия для комментирования могли бы вы объяснить, как это может помочь моей выше проблемы..? –

+0

Ну, я согласен, что может быть про с вашим источником файлов shp. Трудно сказать, какова ваша ошибка. Я понял, что это не ваши настоящие файлы, и что вы не создали воспроизводимый пример. Если это фактические файлы, которые вы используете, а не просто доступные для иллюстрации, и никто не подходит к лучшему подходу, возможно, вы можете перейти в список рассылки R-SIG-GEO. –

+0

А, ок. Я получил 'ogrInfo()' для работы, хотя ... например. 'ogrInfo (". "," 1905 ")' (переименовано в match mrgid) –

Смежные вопросы