2016-09-26 5 views
0

Я относительно новичок в R, но имеет опыт работы на традиционных языках программирования (например, C, Java). Я недавно столкнулся с ситуацией, когда у меня было так много файлов данных для загрузки, что я тратил почти столько же времени на одну задачу, сколько и на фактический анализ. Я потратил немного времени на поиск в Google, но не столкнулся ни с какими решениями, которые я нашел непосредственно релевантными (я, возможно, пропустил что-то, я так нетерпелив). Несмотря на это, я придумал простое решение моей проблемы, которое я хотел бы поделиться с сообществом на случай, если кто-то еще окажется в подобных обстоятельствах.R скрипт, программно пакетный импорт нескольких файлов csv в виде списка фреймов данных (решение)

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

У меня было несколько идей, и после того, как играть с кодом немного я придумал следующее решение:

# Create mapping that associates files with a handle that the loader will use to 
# generate a named list of data frames (don't even try this on the cmdline) 
createDataFileMapping <- function() { 
    list(
    c(file = "file1.csv", descr = "descriptor1"), 
    c(file = "file2.csv", descr = "descriptor2"), 
    ... 
) 
} 

# Batch load csv files and return as list of data frames 
loadTrialData <- function(load.dir, mapping) { 
    dfList <- list() 
    for (item in mapping) { 
    file <- paste(load.dir, item[["file"]], sep = "/") 
    df <- read.csv(file) 
    dfList[[ item[["descr"]] ]] <- df 
    } 

    return(dfList) 
} 

Вызывающую так просто, как loadTrialData("~/data/directory", createDataFileMapping()).

Уверен, что есть другие способы решения этой проблемы, но вышеприведенная работа выполняется в моем случае. Я уверен, что это немного менее эффективно с точки зрения памяти, чем загрузка файлов непосредственно в кадры данных в глобальной среде, а синтаксис для передачи отдельных кадров данных для функций анализа/построения не столь изящный, как это могло бы быть, m не разборчив. Если у вас есть более гибкое/обобщаемое решение, пожалуйста, не стесняйтесь публиковать сообщения!

+0

Поскольку здесь нет четкого ответного вопроса о программировании, этот пост кажется более подходящим для [codereview.se], чем Stack Overflow. – MrFlick

+0

Возможно, хотя я думаю, что кто-то, кто ищет помощь в этой или подобной проблеме, может не согласиться. Переполнение стека - это справочная служба с высоким трафиком, и вся информация о размещении здесь заключается в том, чтобы размещать информацию, где она будет наиболее эффективной. Если это не соответствует «обычной» мудрости, пусть так и будет. И конечно, я тоже буду об этом писать. –

ответ

0

Что у вас есть звук, я хотел бы добавить только два замечание:

  • Не беспокойтесь о дополнительном использовании памяти, предполагая, что кадры данных нетривиального размера вы не потеряете много положить их в большой список.

  • Вы можете добавить ... в качестве аргумента в вашей функции и передать его через к read.csv, так что если другой пользователь должен указать дополнительные аргументы, потому что их файл не был совсем в том же формате (или хочет stringsAsFactors=FALSE или что-то) то у них есть такая возможность.