2013-02-18 8 views
1

Я написал простую функцию:зацикливание функцию над несколькими файлами

myfunction <- function(fileName, stringsAsFactors=TRUE,     
        check.names=FALSE,    
        skip =1,...) { 
Data <- read.delim(fileName, skip = skip,      
       stringsAsFactors=stringsAsFactors,      
       check.names = check.names, ...)     
cb <- list()      
Index <- as.numeric(as.factor(Data[,1]))    
cb <- cbind(Data, Index)    
return(cb)   

}

Эта функция принимает первый столбец файла с именем Data, создать индекс в соответствии с этой первой колонке, а затем cbind файл и индекс. Эта функция будет применяться в файле с именем: myfile_00.txt, myfile_01.txt и так далее .. Для одного файла он выглядит следующим образом:

myfunction (fileName = "myfile_00.txt") 
myfunction (fileName = "myfile_01.txt") 
.......   

У меня есть около 1000 файлов, так что я полагаю, цикл может быть от другого сообщение:

mytxt <- dir(pattern=".txt")  
n  <- length(mytxt)  
mylist <- vector("list", n) 
for(i in 1:n) { 
    mylist[[i]] <- read.delim(mytxt[i], header = F, skip = 1) 
} 

затем:

d <- lapply(mylist, myfunction) 

К сожалению, это не работает ... При использовании lapply возникает ошибка:

Error in read.table(file = file, header = header, sep = sep, quote = quote, : 
'file' must be a character string or connection 

Поскольку я новичок в R, вероятно, я делаю ошибки, я не могу понять. Может ли кто-нибудь мне помочь?

Бест,

F.

+1

Почему вы читаете дважды? Вы также используете 'read.delim' в своей функции ..? и ваш for-loop читает, используя 'read.delim'. – Arun

+0

okk, спасибо за это первое предложение. Поэтому достаточно написать: myfunction <- function (myfile [[i]]) { Index <- as.numeric (as.factor (myfile [[i]] [, 1])) cb = cbind (myfile [[i]], Index) return (cb) } – Fuv8

+1

Лучше, чем показал @flodel. Передайте файлы в качестве входных аргументов функции и выполните загрузку файла внутри функции. Проверьте ответ флолели. – Arun

ответ

4

Как @Arun отметили, вы пытаетесь запустить функцию дважды: один раз на файлы, и как только один фреймов данных, которые вы создали ... Вместо этого, ваш код должен выглядеть так:

files <- list.files(pattern = ".txt") 
mylist <- lapply(files, myfunction) 
+0

Привет, flodel !!!!!! Он отлично работает! большое спасибо!!!! – Fuv8

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