Управление несколькими файлами в R - PullRequest
3 голосов
/ 21 июня 2011

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

XXXXX 
XXXXX
XXXXX
Col1 Col2 Col3 Col4 Col5
1 36 37 35 36 
2 34 34 36 37 
. 
. 
1500 34 35 36 35 

Я написал код (ниже) для извлечения выбранных строк столбцов 1 и 5 изотдельный файл .txt, и я хотел бы сделать цикл для всех файлов, которые у меня есть.

data <- read.table(paste("/Users/tan/Desktop/test/01.txt"), skip =264, nrows = 932)
selcol<-c("V1", "V5")
write.table(data[selcol], file="/Users/tan/Desktop/test/01ed.txt", sep="\t")

С помощью вышеуказанного кода файл .txt теперь выглядит следующим образом:

Col1 Col5  
300 34  
. 
. 
700 34  

Если возможно, я бы хотел объединить все Col5 из .txtфайлы с одним из столбца 1 (который одинаков для всех текстовых файлов), поэтому он выглядит примерно так:

Col1 Col5a Col5b Col5c Col5d ...
300 34 34 36 37
. 
. 
700 34 34 36 37 

Спасибо!Tan

1 Ответ

5 голосов
/ 21 июня 2011

Хорошо - я думаю, что я отвечу на все ваши вопросы здесь, но дайте мне знать, если я что-то пропустил.Общий процесс, который мы пройдем здесь:

  1. Идентифицирует все файлы, которые мы хотим прочитать и обработать в нашем рабочем каталоге
  2. Используйте lapply для итерациикаждое из этих имен файлов для создания единого объекта списка, который содержит все данные
  3. Выберите интересующие вас столбцы
  4. Объедините их вместе по общему столбцу

Для целей примера рассмотрим, что у меня есть четыре файла с именами от file1.txt до file4.txt, которые выглядят так:

    x           y          y2
1   1  2.44281173 -2.32777987
2   2 -0.32999022 -0.60991623
3   3  0.74954561  0.03761497
4   4 -0.44374491 -1.65062852
5   5  0.79140012  0.40717932
6   6 -0.38517329 -0.64859906
7   7  0.92959219 -1.27056731
8   8  0.47004041  2.52418636
9   9 -0.73437337  0.47071120
10 10  0.48385902  1.37193941

##1. identify files to read in
filesToProcess <- dir(pattern = "file.*\\.txt$")
> filesToProcess
[1] "file1.txt" "file2.txt" "file3.txt" "file4.txt"


##2. Iterate over each of those file names with lapply
listOfFiles <- lapply(filesToProcess, function(x) read.table(x, header = TRUE))

##3. Select columns x and y2 from each of the objects in our list
listOfFiles <- lapply(listOfFiles, function(z) z[c("x", "y2")])

##NOTE: you can combine steps 2 and 3 by passing in the colClasses parameter to read.table.
#That code would be:
listOfFiles <- lapply(filesToProcess, function(x) read.table(x, header = TRUE
  , colClasses = c("integer","NULL","numeric")))

##4. Merge all of the objects in the list together with Reduce. 
# x is the common columns to join on
out <- Reduce(function(x,y) {merge(x,y, by = "x")}, listOfFiles)
#clean up the column names
colnames(out) <- c("x", sub("\\.txt", "", filesToProcess))

В результате получается следующее:

> out
    x       file1        file2       file3        file4
1   1 -2.32777987 -0.671934857 -2.32777987 -0.671934857
2   2 -0.60991623 -0.822505224 -0.60991623 -0.822505224
3   3  0.03761497  0.049694686  0.03761497  0.049694686
4   4 -1.65062852 -1.173863215 -1.65062852 -1.173863215
5   5  0.40717932  1.189763270  0.40717932  1.189763270
6   6 -0.64859906  0.610462808 -0.64859906  0.610462808
7   7 -1.27056731  0.928107752 -1.27056731  0.928107752
8   8  2.52418636 -0.856625895  2.52418636 -0.856625895
9   9  0.47071120 -1.290480033  0.47071120 -1.290480033
10 10  1.37193941 -0.235659079  1.37193941 -0.235659079
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...