2014-01-30 3 views
2

Я пытаюсь написать функцию для связывания файлов. Это данные о погоде в течение 50 лет, каждый из которых раздельно по годам и 75 повторений каждого года. Я хочу связать файлы вместе, чтобы у меня был непрерывный 50-летний пробег. Я должен закончить 75 50-летних пробегов.Объединить тысячи файлов в R - в правильном порядке

Файлы называются «клик», а затем rep («01» - «99»), затем 01year («2014» - «2064»). Итак, файл clim01012014.txt - это мой первый файл. Но нет повторений, кратные 4.

Моих мыслей импортировать мои файлы в виде списка

files <- list.files("../Dropbox/APSIM/Climate files") 

затем использовать функцию, основанную на rbind связать вместе файлы, которые имеют одни и те же повторения (что часть посередине, после «клина»).

Но у меня возникли проблемы концептуализации, как сказать, R, чтобы связать файлы, которые имеют разные концовки, но одни и те же средние цифры -

rbind(clim01012014.txt, clim01012015.txt, clim01012016.txt, clim01012017.txt, . . .) 

Может быть, мне нужно будет цикл вместо функции?

ответ

0

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

data <-NULL 
for (i in 1:75){ 
    for (filename in l[[i]]){ 
    data <- rbind(data, read.table(sprintf("Bind/%s", filename))) 
    write.csv(file = sprintf("met%s.csv",names(l[i])), data, row.names = FALSE,  
    col.names=FALSE) 
    } 
data <- NULL 
} 
2

Входные файлы:

set.seed(1) 
files = sort(paste0('clim', formatC(sample(1:2, 10, T), width = 2, flag = 0), '01', sample(2014:2064, 10))) 
files 
# [1] "clim01012022" "clim01012024" "clim01012050" "clim01012058" "clim02012030" "clim02012032" "clim02012036" "clim02012046" 
# [9] "clim02012047" "clim02012057" 

Split вашим "повторении":

l = split(files, sub('clim(..).*', '\\1', files)) 
l 
#$`01` 
#[1] "clim01012022" "clim01012024" "clim01012050" "clim01012058" 
# 
#$`02` 
#[1] "clim02012030" "clim02012032" "clim02012036" "clim02012046" "clim02012047" "clim02012057" 

Теперь вы можете lapply за этот список - чего-л, как:

lapply(l, function(x) do.call(rbind, lapply(x, read.csv))) 
+0

Это меня очень близко, но я не понимаю, является ли 'l' еще списком? Из того, что я могу сказать, все мои файлы теперь упорядочены по репутации, год. Когда я применяю эту функцию, как она отличается от применения к списку, когда она не была заказана? – Nazer

+0

@Nazer 'l' - это список векторов (каждый вектор, соответствующий вашему« rep »); для данного «rep» тогда внутренняя 'lapply' просматривает каждый из имен файлов, читает их и' do.call' позже 'rbind' их вместе; конечным результатом будет список 'data.frame', где каждый элемент списка будет иметь заданный« rep » – eddi

+0

Хорошо, хорошо! Я просто получаю ошибку прямо сейчас (не могу открыть соединение), ошибка, вероятно, моя. Я буду продолжать работать над этим. – Nazer

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