2013-12-06 1 views
1

Я уже загружен 20 CSV файлов с функцией:Создание списка/вектор одного столбца из разных CSV

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

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

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

Во всех этих CSV файлов столбец «Присоединение». Я хотел бы сделать список всех «имен» внутри этих столбцов из каждого файла csv. Один большой список.

Две проблемы:

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

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

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

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

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

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

ответ

3

Первый прием: вы можете прочитать все таблицы в списке фреймов данных, используя lapply. Это проще для работы с более чем 20 отдельными кадрами данных.

tbl = list.files(pattern="*.csv") 
list_of_data = lapply(tbl, read.csv) 

Второй трюк: вы можете рекомбинировать этот список в один кадр данных с использованием do.call в сочетании с rbind.

all_data = do.call(rbind, list_of_data) 

Вы можете выбрать содержимое Accession поля перед точкой, используя регулярные выражения. Здесь полезен пакет stringr. ^ представляет начало строки, [[:alnum:]] представляет собой букву или номер (буквенно-цифровой символ), а + означает один или несколько.

library(stringr) 
all_data$CleanedAccession = str_extract(all_data$Accession, "^[[:alnum:]]+") 

Наконец, вы можете удалить дубликаты по Подменю на не- duplicated значений.

all_data = subset(all_data, !duplicated(CleanedAccession)) 
+0

Этот код выглядит прекрасно, но проблема в том, что я не могу использовать rbind, потому что у меня есть различное количество столбцов/строк в каждом файле csv. Любое решение? – Rechlay

+0

@Rechlay: если содержимое каждой таблицы представляет собой нечто подобное, вы должны их объединить. (Вы можете добавить фиктивные поля, чтобы совместить столбцы.) С другой стороны, если они представляют разные вещи, то, вероятно, лучше всего сохранить их в виде списка кадров данных. Вы можете использовать 'lapply' для перебора списка и обновления каждого фрейма данных. –

0

Если вам просто нужно список имен, и если они все отформатированы как в вашем примере, а затем с помощью @ all_data Ричи:

names <- unique(substr(all_data$Accession,0,9)) 

делает это без регулярных выражений.

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