2016-10-06 3 views
1

Я довольно новичок в работе с R, но пытаюсь это сделать. У меня есть десятки спектральных наборов данных ENVI, хранящихся в каталоге. Каждый набор данных разделен на два файла. Все они имеют одинаковое название конвенции, то есть:читайте несколько файлов ENVI и объедините их в один csv

  • ID_YYYYMMDD_350-200nm.asr
  • ID_YYYYMMDD_350-200nm.hdr

Задача состоит в том, чтобы прочитать набор данных, добавьте две колонки (ID и дата от имени файла) и сохранить результаты в файле * .csv. Я получил это, чтобы работать для одного файла (hardcoded).

library(caTools) 

setwd("D:/some/path/software_scripts") 

### filename without extension 
name <- "011a_20100509_350-2500nm" 

### split filename in area-id and date 
flaeche<-substr(name, 0, 4) 
date <- as.Date((substr(name,6,13)),"%Y%m%d") 

### get values from ENVI-file in a matrix 
spectrum <- read.ENVI(paste(name,".esl", sep = ""), headerfile=paste(name,".hdr", sep="")) 

### add columns 
spectrum <- cbind(Flaeche=flaeche,Datum=as.character(date),spectrum) 


### CSV-Dataset with all values 
write.csv(spectrum, file = name,".csv", sep=",") 

Я хочу объединить все доступные файлы в один файл * .csv. Я знаю, что я должен использовать list.files, но понятия не имею, как реализовать функцию read.ENVI и добавить полученные матрицы в CSV.


Update:

library(caTools) 

setwd("D:/some/path/mean") 

files <- list.files() # change or leave totally empty if setwd() put you in the right spot 

all_names <- sub("^([^.]*).*", "\\1", files) # strip off extensions 

name <- unique(all_names) # get rid of duplicates from .esl and .hdr 

# wrap your existing code in a function 
mungeENVI <- function(name) { 

    # split filename in area-id and date 
    flaeche<-substr(name, 0, 4) 
    date <- as.Date((substr(name,6,13)),"%Y%m%d") 

    # get values from ENVI-file in a matrix 
    spectrum <- read.ENVI(paste(name,".esl", sep = ""), headerfile=paste(name,".hdr", sep="")) 

    # add columns 
    spectrum <- cbind(Flaeche=flaeche,Datum=as.character(date),spectrum) 
    return(spectrum) 
} 

# use lapply to 'loop' over each name 
list_of_ENVIs <- lapply(name, mungeENVI) # returns a list 

# use do.call(rbind, x) to turn it into a big data.frame 
final_df <- do.call(rbind, list_of_ENVIs) 

# now write output 
write.csv(final_df, "all_results.csv") 

вы можете найти образец набора данных здесь: Sample dataset

+1

Вам необходимо получить все ваши файлы в один большой фрейм данных, что-то вроде этого 'lapply (list.files (dir), read.ENVI)%>% do.call (rbind,.)' – Nate

+0

спасибо за ваш ответ, но это все еще слишком загадочно для меня. –

+0

не беспокойтесь, дайте мне пару минут, и я вышлю вам более подробный ответ. – Nate

ответ

0

Я работаю с большим количеством лабораторных данных, где я могу полагаться на выходные файлы быть в надежный формат (тот же порядок столбцов, имя столбца, формат заголовка и т. д.). Таким образом, предполагается, что файлы .ENVI, которые у вас есть, аналогичны. Если ваши файлы не такие, я тоже рад помочь с этим, мне просто нужно увидеть фиктивный файл или два.

В любом случае, вот идея:

library(caTools) 
library(lubridate) 
library(magrittr) 

setwd("~/Binfo/TST/Stack/") # adjust as needed 

files <- list.files("data/", full.name = T) # adjust as needed 
all_names <- gsub("\\.\\D{3}", "", files) # strip off extensions 
names1 <- unique(all_names) # get rid of duplicates 

# wrap your existing code in a function 
mungeENVI <- function(name) { 
    # split filename in area-id and date 
    f <- gsub(".*\\/(\\d{3}\\D)_.*", "\\1", name) 
    d <- gsub(".*_(\\d+)_.*", "\\1", name) %>% ymd() 
    # get values from ENVI-file in a matrix 
    spectrum <- read.ENVI(paste(name,".esl", sep = ""), headerfile=paste(name,".hdr", sep="")) 
    # add columns 
    spectrum <- cbind(Flaeche=f,Datum= as.character(d),spectrum) 
    return(spectrum) 
} 
# use lapply to 'loop' over each name 
list_of_ENVIs <- lapply(names1, mungeENVI) # returns a list 

# use do.call(rbind, x) to turn it into a big data.frame 
final_df <- do.call(rbind, list_of_ENVIs) 
# now write output 
write.csv(final_df, "data/all_results.csv") 

Позвольте мне знать, если у вас есть какие-либо проблемы, и мы в идти оттуда. Приветствия.

Я отредактировал свой ответ немного, я думаю, что проблема, с которой вы попали, находится в list.files(), она должна была иметь аргумент full.name = T. Я также скорректировал ваш метод парсинга, чтобы быть немного более защищенным и использовать выражения захвата grep. Я тестировал код с двумя примерами файлов (4 действительно), но я могу построить большую матрицу (элементы 66743). Также я использовал lubridate, я думаю, что это лучший способ работать с датами и временем.

+0

Привет, спасибо, что вернулись на это! Я должен был внести некоторые незначительные изменения в удаление расширений и удаления дубликатов, которые теперь работают фантастически. К сожалению, есть ошибка: 'Ошибка в read.ENVI (вставка (name," .esl ", sep =" "), headerfile = paste (name,: read.ENVI: Не удалось открыть файл заголовка ввода: .hdr Вызывается из: read.ENVI (вставка (name, ".esl", sep = ""), headerfile = paste (name, ".hdr", sep = "")) ' –

+0

изменений:' all_names <- sub ("^ ([^.] *). *", "\\ 1", файлы) # strip off extensions name <- unique (all_names) # избавиться от дубликатов из .esl и .hdr' –

+0

Можете ли вы проверить имена переменных и посмотреть, есть ли там пустая строка? – Nate