Как создавать многострочные графики из коллекции файлов rdta

#r

#r

Вопрос:

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

 BD-1994.rdta
BD-1996.rdta
BD-1999.rdta
BD-2004.rdta
BF-1992.rdta
...
UG-1988.rdta
UG-1995.rdta
UG-2001.rdta
VN-1992.rdta
VN-1997.rdta
  

Две первые буквы (например, «BD») представляют конкретную страну (по ее коду ISO), а четыре цифры представляют год проведения данного обследования.

Я хотел бы обработать эти данные, чтобы я мог создать один многострочный график временных рядов показателей рождаемости для каждой страны, где каждая строка представляет год проведения обследования. Например, первый график будет для «BD» (Бангладеш) и будет отображать четыре временных ряда за 1994, 1996, 1999 и 2004 годы.

Структура отдельных файлов следующая:

 time     fertility
1        3.2
2        2.6
...      ...
7        2.4 
  

Моя идея на данный момент состоит в том, чтобы использовать rbind в цикле for и создать один массивный набор данных со всеми данными в нем.
Затем мне нужно аккуратно разделить данные по коду страны, возможно, используя функцию типа «subset» (но не похоже, что subset является подходящим инструментом для работы.

Есть предложения о том, как выполнить это управление данными, чтобы я мог затем вызвать функцию plot в R для фрейма данных, который содержит данные опроса за все годы в пределах данной страны?

Спасибо

Комментарии:

1. несколько советов к решению при отсутствии времени на разработку полного решения: (1) используйте lapply в списке файлов для получения списка data.frames; (2) используйте do.call(rbind,DFlist) для получения одного массивного набора данных (как вы предлагаете); (3) используйте melt из reshape пакета, чтобы получить массивный фрейм данных в более удобной форме; (4) используйте ggplot для соответствующего разделения графиков. С некоторыми из них потребуется немного повозиться.

2. ХОРОШО — спасибо за эскизное решение. Я буду работать над этим сейчас…

3. Но — не уверен, почему вы предлагаете использовать lapply для получения списка файлов. Не будет ли достаточно list.files(pattern=».rdata»)?

4. Я имел в виду что-то вроде datList <- lapply(as.list(list.files(pattern=".rdata"))); datFrame <- do.call(rbind,datList)

5. утомительная / неудобная часть заключается в настройке соответствующих столбцов для определения года и страны для каждого фрагмента, хотя на самом деле это может быть не так сложно, как я думал — если вы используете strsplit и gsub в списке самих файлов (или просто вводите векторы вручную!) вы можете rep() использовать для них соответствующий шаблон для построения столбцов идентификаторов

Ответ №1:

Вот один из подходов, использующих ggplot2 и plyr . Основная идея заключается в создании двух вспомогательных функций для (а) извлечения данных из каждого rdata файла во фрейм данных и (б) построения временных рядов для каждой страны. Как только эти функции определены, относительно просто использовать plyr функции для перебора файлов для создания требуемых графиков. Я бы посоветовал вам запустить этот код для ваших данных и сообщить о любых ошибках, которые вы получите, поскольку я не могу протестировать свой код в отсутствие каких-либо данных.

требуется (plyr)

 # function to extract data frame from each rdata file
get_data_frame = function(file_name){
    temp_env = new.env()
    load(file_name, temp_env)
    mydata  = get(ls(envir = temp_env), temp_env)
    country = substr(file_name, 1, 2)
    year    = substr(file_name, 4, 7)
    df = data.frame(mydata, country, year)
    return(df)
}

# function to save time series plot of fertility grouped by year
plot_country_data = function(country_df){

    require(ggplot2)
    p1 = ggplot(country_df, aes(x = time, y = fertility))  
         geom_line(aes(group = year))
    ggsave(filename = paste(country_df, ".pdf", sep = ""))

}

# extract all rdata files in working directory
rdata_files = list.files(pattern = 'rdata')

# consolidate data into one big data frame
big_data   = ldply(rdata_files, get_data_frame)

# plot data for each country and save as pdf
d_ply(big_data, .(country), plot_country_data)