2012-04-18 5 views
1

У меня есть около 100 файлов csv с общими заголовками, которые я хочу объединить. Заголовки - «Lat», «Long» и «value». Я пытаюсь объединить все файлы CSV, так что результат будетСлияние нескольких файлов csv в R

"Lat" "Lon" "Value1" "Value2"..."Value 100" 

Lat и Lon колонны одинаковы для всех файлов CSV. Объединение двух файлов легко

merge(data.frame1, data.frame2, by=c('Lat','Lon')) 

Однако, я попытался следующий код, который не работал:

file_list <- list.files(~/source) 
list_of_files <- lapply(file_list, read.csv) 
m1 <- merge_all(list_of_files, by=c("Lat","Lon"), all=TRUE) 

, который бросает ошибку

Error in merge.data.frame(dfs[[1]], Recall(dfs[-1]), all = TRUE, sort = FALSE, : 
    formal argument "all" matched by multiple actual arguments. 

Может кто-нибудь помочь мне в этом отношении.

+1

'list.files (~/source)' является синтаксической ошибкой. 'merge_all' не поставляется с обычной установкой R; сообщите нам, где это. –

+0

merge_all поставляется с пакетом reshape, и, к сожалению, синтаксис ... но в программе я использовал правильный. – Navin

ответ

4

Вы можете использовать Reduce и простой merge:

m1 <- Reduce(function(old, new) { merge(old, new, by=c('Lat','Lon')) }, list_of_files) 
+2

Вы забыли ', all = TRUE'. –

1

Это может работать хорошо, но вы не дали нам никаких данных для работы с. Я лично использую способ dbaupp и не уверен, какой из них быстрее; тем не менее, я редко попадаю в большие данные, поэтому метод «С уменьшением» намного облегчает мне работу с таким путем (я выпускаю новый R-пакет через несколько месяцев, у которого есть функция, чтобы делать мультимерж, основанный на принципе по тому же мышлению, что и ответ дбауппа). Если вы имеете дело с большими данными, вы можете захотеть пометить два (PS, я украл это откуда-то, поскольку я редко думаю в циклах для решения проблем, но не могу указать, где).

DF <- list_of_files[[1]][, c('lat', 'Lon')] 
    for (.df in list_of_files) { 
    DF <-merge(DF,.df,by=c('Lat', 'Lon'), all=T, suffixes=c("", "")) 
} 
DF 
+0

Спасибо, оба отлично работают, но для слияния некоторых файлов csv я получаю сообщение об ошибке «Ошибка в match.names (clabs, names (xi)): имена не соответствуют предыдущим именам». Я думаю, что это было связано с некоторой ошибкой в ​​функции merge(), о которой сообщалось ранее. – Navin