2016-04-14 3 views
0

Я беру вводный курс R-программирования на Cousera. В первом задании мы оцениваем список сотен файлов csv в указанном каталоге («./specdata/). Каждый файл csv, в свою очередь, содержит сотни записей данных о загрязнителях образца в атмосфере - дату, образец сульфита , образец нитрата и идентификатор, который идентифицирует местоположение выборки.R для цикла - добавление результатов за пределы цикла

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

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

Внутри цикла я присваиваю содержимое файла csv переменной. Затем я делаю эту переменную фреймом данных и использую rbind, чтобы добавить к нему файл, считанный в течение каждого цикла. Я использую na.omit для удаления отсутствующих файлов из переменной. Затем я использую rbind, чтобы добавить результат каждой итерации цикла к переменной. Когда я печатаю переменную фрейма данных в цикле, я могу видеть весь полный список, подгруппированный по id. Но когда я печатаю переменную вне цикла, я вижу только последний элемент в векторе id.

Я хотел бы создать сводный список всех записей, соответствующих аргументу id в цикле, а затем передать список консоли за пределами цикла для дальнейшей обработки. Я не могу заставить это работать. Мой код показан ниже.

Это неправильный подход? Похоже, это может сработать. Любая помощь будет оценена по достоинству. Я искал StackOverflow и не мог найти ничего, что вполне соответствует тому, что я пытаюсь сделать.

pmean <- function(directory = "./specdata/", pollutant, id = 1:322) { 

    x <- list.files(path=directory, pattern="*.csv") 
    x <- paste(directory, x, sep="") 

    id1 <- id[1] 
    id2 <- id[length(id)] 

    for (i in id1:id2) { 

    df <- read.csv(x[i], header = TRUE) 
    df <- data.frame(df)   
    df <- na.omit(df) 
    df <- rbind(df) 

    print(df) 

    } 

    # would like a consolidated list of records here to to do more stuff, e.g. filter on pollutant and calcuate mean 

} 
+0

[list.files] (http://www.inside-r.org/r-doc/base/list.files) имеет аргумент * full.names * (по умолчанию False), поэтому нет необходимости вставлять каталог. Также read.csv импортирует в фрейм данных, поэтому нет необходимости в строке 'data.frame()'. И 'na.omit()' может быть избыточным, поскольку 'list.files' выбирает все не пропускаемые файлы из указанного пути. Если вы имеете в виду пропустить пустые строки, [read.table] (http://www.inside-r.org/r-doc/utils/read.csv), то производная функция 'read.csv' имеет такой аргумент (по умолчанию к Истине). – Parfait

ответ

0

Вы можете просто определить кадр данных вне цикла for и добавить к нему. Кроме того, вы можете пропустить некоторые шаги между ... Есть несколько способов улучшить здесь ... :-)

pmean <- function(directory = "./specdata/", pollutant, id = 1:322) { 

    x <- list.files(path=directory, pattern="*.csv") 
    x <- paste(directory, x, sep="") 

    df_final <- data.frame() 
    for (i in id) { 

    df <- read.csv(x[i], header = TRUE) 
    df <- data.frame(df)   
    df <- na.omit(df) 
    df_final <- rbind(df_final, df) 

    print(df) 

    } 

    # would like a consolidated list of records here to to do more stuff, e.g. filter on pollutant and calcuate mean 
    return(df_final) 
} 
0

лишь вызов df <- rbind(df) вы фактически переписав df каждый раз. Вы можете исправить это, делая что-то вроде этого:

df = data.frame() # empty data frame 
for(i in 1:10) { # for all you csv files 
    x <- mean(rnorm(10)) # some new information 
    df <- rbind(df, x) # bind old dataframe and new value 
} 

Кстати, если вы знаете, как большой df заранее будет, то это не правильный способ сделать это.

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