2014-12-23 3 views
0

У меня есть много файлов CSV в трех отдельных папках следующим образом:Как обрабатывать несколько файлов CSV в R

folder1 
a1_0023.csv 
a2_0034.csv 
a3_6163.csv 
... 
(100 files) 

folder2 
b1_0023.csv 
b2_0034.csv 
b3_6163.csv 
... 
(100 files) 

folder3 
c1_0023.csv 
c2_0034.csv 
c3_6163.csv 
... 
(100 files) 

И у меня есть текстовый файл, в котором перечислены последние четыре цифры:

theLastFourDigits.txt 
0023 
0034 
6163 
... 
(100 lines) 

Для 0023 файлов, я делаю простую работу в R:

a <- read.table("D:/folder1/a1_0023.csv", header=FALSE, sep=",") 
a <- as.matrix(a) 
b <- read.table("D:/folder2/b1_0023.csv", header=FALSE, sep=",") 
b <- as.matrix(b) 
c <- read.table("D:/folder3/c1_0023.csv", header=FALSE, sep=",") 
c <- as.matrix(c) 

# Initiate the column vector that contains the results 
myanswer <- matrix(0, nrow=100, ncol=1) 

# Do a simple job, and store the result in myanswer column 
myanswer[1] = nrow(a)*nrow(b)/nrow(c) 

у меня есть два вопроса: (1) Как мы можем перебирать это процесс для всего 100 цифр? (2) Как мы можем выполнять несколько заданий, если у меня нет файла списка theLastFourDigits.txt?

EDIT:

Я пытался что-то вроде следующего:

setwd("D:/folder1/") 
filelist1 <- Sys.glob("*.csv") 
setwd("D:/folder2/") 
filelist2 <- Sys.glob("*.csv") 
setwd("D:/folder3/") 
filelist3 <- Sys.glob("*.csv") 

for (i in 1:100) { 

setwd("D:/folder1/") 
a <- read.csv(filelist1[i], header=FALSE, sep=",") 
a <- as.matrix(a) 
setwd("D:/folder2/") 
b <- read.csv(filelist2[i], header=FALSE, sep=",") 
b <- as.matrix(b) 
setwd("D:/folder3/") 
c <- read.csv(filelist3[i], header=FALSE, sep=",") 
c <- as.matrix(c) 

nrow(a)*nrow(b)/nrow(c) 

} 

И сообщение об ошибке, как:

Error in read.table(file = file, header = header, sep = sep, quote = quote, : 
    no lines available in input 
3 stop("no lines available in input") 
2 read.table(file = file, header = header, sep = sep, quote = quote, 
    dec = dec, fill = fill, comment.char = comment.char, ...) 
1 read.csv(filelist1[i], header = FALSE, sep = ",") 

Что я здесь отсутствует?

ответ

2

На вопрос (2) вы можете найти эту функцию полезной. Я использовал его в прошлом для чтения во всех файлах csv в данной папке (Windows 7). Вам необходимо будет изменить аргументы read.csv(), необходимые для вашего приложения. После того, как все данные из папки были прочитаны, вы можете преобразовать все кадры данных в матрицы с помощью lapply().

list.csv <- function(mydir, add.source=TRUE) { 
    # combine all csv files in a given directory into a single list 
    filenames <- list.files(mydir)[grep(".csv$", list.files(mydir))] 
    nfiles <- length(filenames) 
    # create an empty list where all the files will be stored 
    files.list <- vector(mode="list", length=nfiles) 
    for(i in 1:nfiles) { 
     # read the data into a temporary file 
     temp <- read.csv(paste(mydir, filenames[i], sep=""), as.is=TRUE) 
     # add a new column identifying the source file 
     if(add.source) temp$source <- filenames[i] 
     # put the data into the list 
     files.list[[i]] <- temp 
     } 
    files.list 
    } 

mylist <- list.csv("C:/temp/") 

# look at headers from all the data frames 
lapply(mylist, head) 

# convert all the data frames to matrices 
mylistm <- lapply(mylist, as.matrix) 
+0

Я получил сообщение об ошибке: Ошибку в read.table (файл = файл, заголовок = заголовке, Сентябрь = Сентябрь, цитата = цитата:. Нет доступных линий на входе Я считаю, что что-то пойдет не так в 'чтения csv' в цикле for. –

+0

Итак, я предполагаю, что вы заменили строку read.csv() в моем коде строкой с кодом read.table(). Какова была строка кода, которую вы отправили, когда вы получили эта ошибка? –

+0

Я не изменил ваш код. –

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