2015-01-28 4 views
0

Я читаю файлы csv из определенной папки, все они имеют одинаковую структуру. Кроме того, я создал функцию, которая добавляет определенное значение в dataFrame.Применение функции ко всем файлам csv из определенной папки

Я создал «чтение папок» - часть, а также создал функцию. Однако теперь мне нужно соединить эти два друг с другом. Это где я имею свои проблемы:

Вот мой код:

addValue <- function(valueToAdd, df.file, writterPath) { 
    df.file$result <- df.file$Value + valueToAdd 
    x <- x + 1 
    df.file <- as.data.frame(do.call(cbind, df.file)) 
    fullFilePath <- paste(writterPath, x , "myFile.csv", sep="") 
    write.csv(as.data.frame(df.file), fullFilePath) 
} 

#1.reading R files 
path <- "C:/Users/RFiles/files/" 
files <- list.files(path=path, pattern="*.csv") 
for(file in files) 
{ 
    perpos <- which(strsplit(file, "")[[1]]==".") 
    assign(
    gsub(" ","",substr(file, 1, perpos-1)), 
    read.csv(paste(path,file,sep=""))) 
} 

#2.appyling function 
writterPath <- "C:/Users/RFiles/files/results/" 
addValue(2, sys, writterPath) 

Как применить функцию addValue() в моей #1.reading R files конструкции? Любые рекомендации?

Я ценю ваши ответы!

UPDATE

При попытке из примера кода, я получаю:

+ } 
+ ## If you really need to change filenames with numbers, 
+ newfname <- file.path(npath, paste0(x, basename(fname))) 
+ ## otherwise just use `file.path(npath, basename(fname))`. 
+ 
+ ## (4) Write back to a different file location: 
+ write.csv(newdat, file = newfname, row.names = FALSE) 
+ } 
Error in `$<-.data.frame`(`*tmp*`, "results", value = numeric(0)) : 
    replacement has 0 rows, data has 11 

Любые предложения?

+0

Какие у вас проблемы? (Вам нужно 'full.names = TRUE' в вашем вызове' list.files() '?) – r2evans

+0

@ r2evans Thx для вашего ответа! Моя проблема в том, что я не знаю, как применить мою функцию 'addValue()' к моей конструкции '1.reading R files'? Атм эти двое полностью отделены друг от друга ... – mrquad

ответ

1

Существует несколько проблем с кодом (например, x в вашей функции никогда не определяется и не сохраняется между вызовами addValue), поэтому я предполагаю, что это сокращенная версия реального кода, и вы все еще остаются остатки. Вместо того, чтобы разбирать его отдельно, я просто предлагаю свой собственный предложенный код и несколько указателей.

Функция addValue выглядит так, что она хороша для изменения data.frame, но я бы не догадался (по крайней мере, по имени), что он также напишет файл на диск (и, возможно, переписать существующий файл).

Я предполагаю, что вы пытаетесь (1) прочитать файл, (2) «добавить значение» к нему, (3) назначить его глобальной переменной и (4) записать его на диск. Третий может быть проблематичным (и спорным с некоторыми программистами), но я оставлю его пока.

Если запись на диск не связана с вашей идеей «добавления значения» в data.frame, я рекомендую вам оставить № 2 отдельно от # 4. Ниже приведена альтернатива вашему коду:

addValue <- function(valueToAdd, df) { 
    df$results <- df$Value + valueToAdd 
    ## more stuff here? 
    return(df) 
} 

opath <- 'c:/Users/RFiles/files/raw'  # notice the difference 
npath <- 'c:/Users/RFiles/files/adjusted' 
files <- list.files(path = opath, pattern = '*.csv', full.names = TRUE) 

x <- 0 
for (fname in files) { 
    x <- x + 1 
    ## (1) read in and (2) "add value" to it 
    dat <- read.csv(fname) 
    newdat <- addValue(2, dat) 

    ## (3) Conditionally assign to a global variable: 
    varname <- gsub('\\.[^.]*$', '', basename(fname)) 
    if (! exists(varname)) { 
     assign(x = varname, value = newdat) 
    } else { 
     warning('variable exists, did not overwrite: ', varname) 
    } 
    ## If you really need to change filenames with numbers, 
    newfname <- file.path(npath, paste0(x, basename(fname))) 
    ## otherwise just use `file.path(npath, basename(fname))`. 

    ## (4) Write back to a different file location: 
    write.csv(newdat, file = newfname, row.names = FALSE) 
} 

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

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

## addValue as defined previously 
opath <- 'c:/Users/RFiles/files/raw' 
npath <- 'c:/Users/RFiles/files/adjusted' 
ofiles <- list.files(path = opath, pattern = '*.csv', full.names = TRUE) 
nfiles <- file.path(npath, basename(ofiles)) 

dats <- mapply(function(ofname, nfname) { 
    dat <- read.csv(ofname) 
    newdat <- addValue(2, dat) 
    write.csv(newdat, file = nfname, row.names = FALSE) 
    newdat 
}, ofiles, nfiles, SIMPLIFY = FALSE) 
length(dats)       # number of files 
names(dats)        # one for each file