2013-05-02 2 views
2

Я знаю, что этот вопрос задан ранее, но ответы на предыдущие сообщения, похоже, не могут решить мою проблему.объединить несколько файлов с разными строками в R

У меня есть десятки файлов с разделителями табуляции .txt. Каждый файл имеет два столбца («pos», «score»). Я хотел бы скомпилировать все столбцы «score» в один файл с несколькими столбцами. Количество строк в каждом файле меняется, и они не имеют отношения к компиляции.

Если кто-то может направить меня на то, как это сделать, желательно в R, было бы очень полезно.

В качестве альтернативы, моя конечная цель - прочитать медианное и среднее значение столбца «оценка» из каждого файла. Поэтому, если это может быть выполнено, с или без компиляции файлов, это будет еще более полезно.

Спасибо.

UPDATE:

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

Я попытался lapply и уменьшить, например,

> files <- dir(pattern="X.*\\.txt$") 
> File_list <- lapply(filesToProcess,function(score) 
+ read.table(score,header=TRUE,row.names=1)) 
> File_list <- lapply(files,function(z) z[c("pos","score")]) 
> out_file <- Reduce(function(x,y) {merge(x,y,by=c("pos"))},File_list) 

, которую я знаю, на самом деле не имеет смысла, учитывая, что я есть переменные номера строк. Я также попробовал plyr

> files <- list.files() 
> out_list <- llply(files,read.table) 

Как и cbind и rbind. Обычно я получаю сообщение об ошибке, потому что номера строк не совпадают, или я просто получаю все данные «оценки», скомпилированные в один столбец.

Совет на аналогичные должности (например, Merging multiple csv files in R, Simultaneously merge multiple data.frames in a list и Merge multiple files in a list with different number of rows) не был полезен.

Надеюсь, это прояснит ситуацию.

+2

Стефан - ты мог пожалуйста, покажите нам, что вы пробовали раньше, и что не сработало? Ваша проблема может быть решена в R довольно легко, но, как было сказано, она очень расплывчата. Пользователи SO не являются вашими персональными кодами ninjas, которые пишут код для вас. –

+0

? Слить. как установка all = FALSE (по умолчанию) не делает то, что вы хотите? –

+0

@Jake Чтобы объединить файлы, я должен был бы их перечислить один за другим, чего я пытаюсь избежать. – stephanhart

ответ

0

Я думаю, что вы хотите чего-л, как это:

all_data = do.call(rbind, lapply(files, 
           function(f) { 
            cbind(read.csv(f), file_name=f) 
           })) 

Вы можете делать все, что «от» типа действия вы хотите. Кроме того, не забудьте настроить различные опции read.csv в соответствии с вашими потребностями.

E.g. когда у вас есть выше, вы можете сделать следующее (и многое другое):

library(data.table) 
dt = data.table(all_data) 

dt[, list(mean(score), median(score)), by = file_name] 

Небольшое примечание: вы можете также использовать data.table «s fread, чтобы читать файлы в вместо read.table и его производных, и это будет намного быстрее, и пока мы на нем, используйте rbindlist вместо do.call(rbind,.

+0

Это делает меня частью этого пути, за исключением того, что он выводит три столбца: «pos», «score» и «file_name», так что все данные постоянно отображаются в столбце, а не разделяются на столбцы на файл. Какие-либо предложения? – stephanhart

1

Эта проблема может быть решена в два этапа:

Шаг 1. Прочитайте данные из ваших файлов CSV в список фреймов данных, где files является вектор имен файлов. Если вам нужно добавить дополнительные аргументы в read.csv, добавьте их, как показано ниже. См. ?lapply.

list_of_dataframes <- lapply(files, read.csv, stringsAsFactors = FALSE) 

Шаг 2. Вычислить средства для каждого кадра данных:

means <- sapply(list_of_dataframes, function(df) mean(df$score)) 

Конечно, вы всегда можете сделать это за один шаг, как это:

means <- sapply(files, function(filename) mean(read.csv(filename)$score)) 
+0

Это сделало (плюс заголовок = ИСТИНА). Благодарю. – stephanhart

+1

Рад, что сработало. Пожалуйста, подумайте о том, чтобы принять этот ответ, если он решает вашу проблему. –