2013-07-22 2 views
0

Привет, Я пытаюсь перебрать каталог файлов excel для анализа.R, R Programming, Loop Directory

Моя переменная называется FileToGrab, которая получает имя файла excel.

Где у меня есть выделение жирным шрифтом FileToGrab - это то, что я хочу, чтобы фрейм данных назывался не фактическим фреймом данных FileToGrab.

Пример FileToGrab = 2013ExcelSheet23

Я хочу, чтобы мой кадр данных будет называться 2013ExcelSheet23 и не FileToGrab.

FileToGrab = 2013ExcelSheet24

Я хочу, чтобы мой кадр данных будет называться 2013ExcelSheet24 и не FileToGrab.

FileToGrab = 2013ExcelSheet25

Я хочу, чтобы мой кадр данных будет называться 2013ExcelSheet25 и не FileToGrab.

..... и прочее.

Новое на R извините, если это не имеет смысла. Благодаря

x <- 1:50 
for(i in seq(along=x)) 
{ 


FileToGrab = gsub("(^ +)|(+$)", "",listofFile[i]) 
FileToGrab = str_replace_all(string=FileToGrab, pattern=" ", repl="") 

DirFileName = paste("C:\\Users\\w47593\\Desktop\\RProjects\\CallCenterProjectJuly2013\\Files\\",FileToGrab) 
DirFileName = str_replace_all(string=DirFileName, pattern=" ", repl="") 

file.name <- DirFileName 
sheet.name <- "Detail" 
FileToGrab = str_replace_all(string=FileToGrab, pattern=".xls", repl="") 


## Connect to Excel File Pull and Format Data 
excel.connect <- odbcConnectExcel(DirFileName) 
**FileToGrab** <- sqlFetch(excel.connect, sheet.name, na.strings=c("","-")) 
odbcClose(excel.connect) 


} 
+2

... Я не уверен, но имена файлов, начинающиеся с числовой цифры, скорее всего, не являются практичными как идентификаторы в R; однако функция 'assign()' может помочь вам заполнить результаты в последовательности переменных, имена которых будут разрешены во время выполнения (так что, возможно, вам нужно что-то в строках 'assign (sprintf (". Sheet.% s ", FileToGrab) , sqlFetch (...)) '). – texb

ответ

1

Почему бы не использовать

files = list.files(DirFileName) 

, а затем перебирать, что загрузить их в R?

Назначение объекта с использованием имен файлов:

objects = list() 
objects[[files[1]]] = ... 
+0

Действительно. кажется, вы отредактировали это, так как я прокомментировал. –

+1

Что вам нужно, аплодисменты? Я удалил свой комментарий, как только заметил, что вы обновили свой ответ. Ваш ответ краток, мой ближе к полному решению, с некоторыми предупреждениями/пояснениями. Оба помогут OP, так что с глупым отношением? –

+0

Я не браконьерство! Я явно работал над моей задолго до того, как на нее ответили только в силу временных меток и длины моего поста. Я бы успешно закончил свою работу, когда вы ответили на две строки ответа, которые не ответили на реальный вопрос. В то же время вы отредактировали свой ответ, и я опубликовал сообщение после нескольких дополнений. Если бы я думал, что ваш был лучшим Ответом, я бы удалил мою (для whit http://stackoverflow.com/a/17797415/429846, где ответы оба работали в одно и то же время, но мои не предлагали ничего нового, поэтому я удалил его). –

3

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

> 11Foo <- 1 
Error: unexpected symbol in "11Foo" 
> `11Foo` <- 1 
> 11Foo 
Error: unexpected symbol in "11Foo" 
> `11Foo` 
[1] 1 

Как мудрый, я сомневаюсь, что вы хотите, чтобы 25+ объектов засоряли ваше рабочее пространство. Гораздо лучшее решение часто заключается в том, чтобы импортировать данные в список и работать с этими объектами. У вас есть подобные проблемы с доступом по географическим названиям

> ll <- list(`1` = 1, `2` = 2) 
> ll$1 
Error: unexpected numeric constant in "ll$1" 
> ll$`1` 
[1] 1 

, но тогда вам не нужно обращаться к ним по имени обязательно, и вы выигрываете, будучи в состоянии пройти по списку с помощью lapply и т.д.

Я хотел бы использовать что-то вроде

fs <- list.file("dir/to/excel/files", glob2rx("*.xls")) 
ll <- vector(mode = "list", length = length(fs)) 

for (i in seq_along(ll)) { 
    excel.connect <- odbcConnectExcel(fs[i]) 
    ll[[i]] <- sqlFetch(excel.connect, sheet.name, na.strings=c("","-")) 
    odbcClose(excel.connect) 
} 

names(ll) <- sub("\\.xls", "", fs) 

Вы бы все равно придется добывать с помощью

ll$"2013ExcelSheet25" 

, но вы также можете использовать

ll[["2013ExcelSheet25"]] 

или лучше

ll[[1]] 

или даже

ll[[which(names(ll) == "2013ExcelSheet25")]] 

Но поскольку это все в одном списке содержатся, и вы можете работать с ними с помощью lapply и сотрудничества.

+0

Вы правы, отвлекая их в список, вероятно, лучшая идея ... – texb