2015-08-24 2 views
2

У меня есть несколько файлов в каталоге, и мне нужно достичь конкатенации (я имею в виду здесь добавить столбцы из других текстовых файлов в один файл) все эти текстовые файлы в один DataFrame. И окончательный файл данных должен содержать несколько столбцов (то же, что и количество текстовых файлов в каталоге). Например, file_1 выглядит следующим образомЧтение нескольких текстовых файлов из каталога и добавление его столбцов в один текстовый файл в R

id  pool1 
ABL1 1352 
ABL12 1236 
ABL13 1022 
ABL14 815 
ABL15 1591 
ABL16 2703 

И так, как и другие файлы, первый столбец является одинаковым для всех остальных файлов в каталоге и вторые столбцы различны.

Ищу выход, который выглядит примерно так,

id /pool1 /pool2 /pool3 /pool4 /pool5 
ABL1 1352 1353 1354 1355 1356 
ABL12 1236 1237 1238 1239 1240 
ABL13 1022 1023 1024 1025 1026 
ABL14 815  816 817  818 819 
ABL15 1591 1592 1593 1594 1595 
ABL16 2703 2704 2705 2706 2707 
ABL17 1449 1450 1451 1452 1453 
ABL18 619  620  621  622 623 
ABL19 1074 1075 1076 1077 1078 

До сих пор я пытался добиться этого в R с помощью следующих сценариев,

lf <- list.files(path = "path/files", pattern = ".txt_samplecount$", full.names = TRUE, recursive = TRUE, include.dirs = TRUE) 
dat <- setNames(lapply(lf, read.table, sep="\t", header=TRUE), lf) 

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

Любая помощь или предложения приветствуются

Спасибо

+0

Вы можете попробовать «расстегнуть» ваши две статьи, 'unstack (dat, pool ~ id)' или вывести второй столбец каждой таблицы в цикле 'lapply' – jenesaisquoi

ответ

1

Использование data.table:

library(data.table) 
setDT(dat) #data containing ids 
lapply(lf,function(x){ 
    y<-fread(lf) 
    nm<-names(y)[2] 
    dat[y,(nm):=get(nm),on="id"]}) 

Более надежный (если какой-либо из lf содержать более одного столбца) будет:

lapply(lf,function(x){ 
     y<-fread(lf) 
     nm<-setdiff(names(y),"id") 
     dat[y,(nm):=mget(nm),on="id"]}) 

Еще более надежный (позволяющий вам м IGHT несколько файлов в lf, которые имеют столбец с именем pool1, например) будет:

lapply(lf,function(x){ 
     y<-fread(lf) 
     nm<-setdiff(names(y),"id") 
     if (length(intersect(nm,names(dat)))){ 
     nm_dup<-intersect(nm,names(dat)) 
     nm_new<-setdiff(nm,nm_dup) 
     dat[y,(nm_new):=mget(nm_new),on="id"] 
     dat[y,paste0(nm_dup,z):=mget(paste0("i.",nm_dup)),on="id"] 
     }else dat[y,(nm):=mget(nm),on="id"]}) 

Где z некоторый уникальный идентификатор для каждого файла в lf, возможно, первые 4 символа имени файла и т.д.

+0

Здравствуйте, спасибо за решение. Но с тремя из этих надежных решений у меня все еще есть ошибка, чтобы получить результаты. Поскольку у меня есть следующее сообщение об ошибке, Error in fread (lf): 'input' mus t - одиночная символьная строка, содержащая имя файла, команду, полный путь к файлу, URL-адрес, начинающийся с «http: //» или «file: //», или сами входные данные – user1017373

+0

@ user1017373 вам необходимо убедиться 'lf' действительно список имен файлов, включая расширения. – MichaelChirico

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