Управление несколькими файлами в R
Я новичок в 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
Спасибо! загар
1 ответ
Хорошо - я думаю, что я задал все ваши вопросы здесь, но дайте мне знать, если я что-то пропустил. Общий процесс, который мы пройдем здесь:
- Определите все файлы, которые мы хотим прочитать и обработать в нашем рабочем каталоге
- использование
lapply
перебирать каждое из этих имен файлов, чтобы создать один объект списка, содержащий все данные - Выберите интересующие вас столбцы
- Объедините их вместе общим столбцом
Для примера рассмотрим четыре файла с именем 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