2016-06-14 3 views
0

У меня есть набор данных в формате txt с 31968 файлами, и каждый файл содержит 365 значений в одном столбце. Я хочу объединить каждый 48 файлов в последовательности, и это принесет 17520 значений.Как объединить векторы в R

Inputs as like 
    a = (X1, x2…………………………………x48) 
    b =(x49, x50 ………………………………x96) 

    Expected outputs like as 
    a = (1, 2, 3, 4,………………………………..17520) 
    b= (1, 2, 3, …………………………………..17520) 

Как я могу загрузить кучу 31968 файл и выполнить эту работу в R.

+0

ли вы читать файлы в R? Что такое «X1, X2, ... и т. Д.»? Если X1, X2 и т. Д. Являются столбцами набора данных. 'unlist (dat [paste0 (" X ", 1:48)], use.names = FALSE)' – akrun

+0

Являются ли файлы, названные в хорошем смысле, предсказуемыми, какие из них следует объединить? Вероятно, вам следует начать с чтения их в [в виде списка кадров данных] (http://stackoverflow.com/a/24376207/903061). – Gregor

ответ

0

С 31968/48 дает 666, создайте список с 666 векторами, каждый из которых содержит 48 имен файлов.

file_names <- list.files(path=".", pattern="\\.txt") # change the path to the directory where the files are kept 
list_of_files <- lapply(1:666, function(x) file_names[((x-1)*48 + 1):((x-1)*48 + 48)]) 

Читать файлы в R, как list_of_data и использовать do.call & rbind конвертировать в один data.frame.

for(i in 1:666){ 
    list_of_data <- lapply(list_of_files[[i]], read.table, sep="\t") # put in appropriate read.table parameters for the text files 
    assign(paste0("a", i), do.call(rbind, list_of_data)) 
    } 

Альтернатива:

for(i in 1:666){ 
    list_of_data <- lapply(list_of_files[[i]], read.table, sep="\t") 
    assign(sprintf("a.%03d", i), do.call(rbind, list_of_data)) 
    } 

Это должно вернуть 666 объектов, например,

"a.001" "a.002" "a.003" "a.004" "a.005" "a.006" "a.007" "a.008" "a.009" "a.010" "a.011" 
"a.012" "a.013" "a.014" "a.015" "a.016" "a.017" "a.018" "a.019" "a.020" "a.021" "a.022" 

Чтобы объединить все 666 data.frame:

frames <- grep("a[.]", ls(), value=T) 
library(plyr) 
output <- ldply(frames, get) 
+0

@ Адам благодарю вас, эта команда работает правильно, но одна вещь, которую я бы попросил, предложите мне легкую и быструю команду, чтобы объединить все 666 dafa.frame и экспортировать в формат csv, txt или xlsx. – irfan

+0

Предполагая, что у вас есть 666 data.frames, 'a.1, a.2, a.3, ..., a.666', (i) создать вектор с именами данных.кадры с 'frames <-grep (" a [.] ", ls(), value = TRUE)'; (ii) помещать их в один список с помощью list_of_frames <- lapply (frames, function (x) get (x)) '; (iiI) используйте do.call для привязки list_of_frames к 'dat <- do.call (rbind, list_of_frames)' –

+0

Экспорт данных в csv с помощью write.csv; dat to txt с write.table. Не собирается помогать с экспортом в формат xlsx. –

0
setwd('files location') 
file_names = list.files() 
for(i in 1:length(file_names)){ 
    p = data.frame() 
    for(i in i:i+47){ 
     setwd('input files location') 
     d = read.table(file_names[i],col.names=c("id"),strip.white=TRUE) 
     p = rbind(p,d) 
    } 
    setwd('output location') 
    write.table(p,paste(file_names[i],".txt",sep=""),row.names=F) 
} 

Смотрите, что все входные файлы лежат в одной директории и никакие другие файлы не присутствуют в этом каталоге , Результат создается с именем 48-го файла, который читается в каждом объединенном списке из 48 файлов.

+0

@ Reddy, я получил эту ошибку в результате вашего предлагаемого решения (Ошибка в файле (файл, «rt»): не удается открыть соединение Кроме того: Предупреждающее сообщение: В файле (файл, «rt»): can not открыть файл 'NA': нет такого файла или каталога) – irfan

+0

можно отправить код, который вы здесь пробовали Наряду с этим скажите мне, какая строка дала u, что ошибка –

+0

setwd ('') file_names = list.files() для (i в 1: length (file_names)) { p = data.frame() для (i in i: i + 47) { setwd ('входное местоположение) d = read.table (file_names [i], col.names = c ("id"), strip.white = TRUE) p = rbind (p, d) } se twd ('output location') write.table (p, paste (file_names [i], ". txt", sep = ""), row.names = F) } Я не мог понять "file, rt" который показывает по ошибке и, вероятно, это происходит во второй последней команде. – irfan