#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)