2014-02-06 3 views
0

Я уже загружен 20 CSV файлов с функцией:Объединить несколько CSV-файлов в один - разное количество столбцов

tbl = list.files(pattern="*.csv") 
for (i in 1:length(tbl)) assign(tbl[i], read.csv(tbl[i])) 

или

list_of_data = lapply(tbl, read.csv) 

Вот как это выглядит:

> head(tbl) 
[1] "F1.csv"   "F10_noS3.csv" "F11.csv"   "F12.csv"   "F12_noS7_S8.csv" 
[6] "F13.csv" 

Мне нужно объединить все эти файлы в один. Назовем его основным файлом, но давайте попробуем создать одну таблицу со всеми именами. Во всех этих файлах csv есть столбец «Присоединение». Я хотел бы сделать таблицу всех «имен» из всех этих файлов csv. Конечно, многие вхождения могут быть повторены в разных файлах csv. Я хотел бы сохранить все данные, соответствующие вступлению.

Некоторые проблемы:

  • Некоторые из этих «имен» одни и те же, и я не хочу, чтобы дублировать их
  • Некоторые из этих «имен» почти то же самое. Разница в том, что есть имя и после него становятся точкой и цифрой.
  • Число столбцов может быть различным, это файлы csv.

Вот скриншот, показывающий, как эти данные выглядят следующим образом: http://imageshack.com/a/img811/7103/29hg.jpg

Позволь мне показать вам, как это выглядит:

AT3G26450.1 <-- 
AT5G44520.2 
AT4G24770.1 
AT2G37220.2 
AT3G02520.1 
AT5G05270.1 
AT1G32060.1 
AT3G52380.1 
AT2G43910.2 
AT2G19760.1 
AT3G26450.2 <-- 

<-- = же образец, разные имена. Следует рассматривать как один. Поэтому просто игнорируйте точку и число после.

Это можно сделать?

Я не мог сделать dput(head), потому что это даже слишком большой набор данных.

Я пытался использовать такой код:

all_data = do.call(rbind, list_of_data) 
Error in rbind(deparse.level, ...) : 
The number of columns is not correct. 


all_data$CleanedAccession = str_extract(all_data$Accession, "^[[:alnum:]]+") 
all_data = subset(all_data, !duplicated(CleanedAccession)) 

Я пытался сделать это в течение почти 2 недель, и я не в состоянии. Пожалуйста, помогите мне.

ответ

2

Ваши вопросы, похоже, содержат несколько подзапросов. Я призываю вас отделить их.

Первое, что вам, по-видимому, необходимо объединить в кадры данных с разными столбцами. Вы можете использовать rbind.fill из plyr пакета:

library(plyr) 
all_data = do.call(rbind.fill, list_of_data) 
+2

'rbind.fill (list_of_data)' будет быстрее, 'dplyr :: rbind_all (list_of_data)' будет еще быстрее. – hadley

+0

оба работают отлично и достаточно быстро. Любые идеи о том, как удалить дубликаты и «те же имена», просто отличаются числом после точки. Благодаря! Любые предложения, что я сделал неправильно, чтобы заслужить понижение? – Rechlay

+0

Очень полезный ответ (и эффективный!). Спасибо. –

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