在R中操作多个文件

Tan*_*Tan 3 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 
Run Code Online (Sandbox Code Playgroud)

我编写了一个代码(下面)来提取单个.txt文件的第1列和第5列的选定行,并希望为我拥有的所有文件执行循环.

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")
Run Code Online (Sandbox Code Playgroud)

使用上面的代码,.txt文件现在看起来像这样:

Col1 Col5  
300 34  
. 
. 
700 34  
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我想将.txt文件的所有Col5与第1列中的一个(所有txt文件都相同)组合在一起,这样它看起来像这样:

Col1 Col5a Col5b Col5c Col5d ...
300 34 34 36 37
. 
. 
700 34 34 36 37 
Run Code Online (Sandbox Code Playgroud)

谢谢!黄褐色

Cha*_*ase 5

好吧 - 我想我在这里遇到了你所有的问题,但如果我错过了什么,请告诉我.我们将在这里经历的一般过程是:

  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))
Run Code Online (Sandbox Code Playgroud)

结果如下:

> 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
Run Code Online (Sandbox Code Playgroud)

  • @Chase不会更简单地取消`merge()`步骤并只读取我们想要的列,然后对重复列进行额外读取?我们可以使用`sapply()`来返回所需列的矩阵,而不是将它们作为带有`lapply()`的列表.类似的东西:`cbind(read.table(filesToProcess [1],header = TRUE)[,1],sapply(filesToProcess,function(x)read.table(x,header = TRUE)[,3]))`(抱歉,这将包裹得非常糟糕.)然后清理列名称? (2认同)