答L网友来信:批量处理电脑里的大量文件

今天一早,收到L网友的来信,问我关于用R批量处理多个数据文件的问题。如果你电脑里有很多个文件需要像L这样对他们重命名、删掉一些没用信息,甚至做更多的事情,比如合并、调整顺序、整理照片等等,那么R完全可以胜任。我曾经给很多博主备份过博客,就是用R完成的。

R菜鸟入门”系列是我的博客访问量最大的帖子。自发布以来,我收到很多网友来信,咨询一些R语言的问题。常见的情况是,来来往往好几封邮件,我才搞明白到底问题是什么。像L网友这样,能用一封邮件把他的需求说清楚,非常难能可贵。提问是需要智慧的。好的提问方式,这样不仅节省时间,也让回答者乐于解决问题。所以,我一读完信,就高高兴兴地打开Rstudio,把这个问题解决了。快乐的一天开始了。

经L网友同意,我把他的来信和我的答复都贴在下面,供R初学者参考。

L网友来信(略作修改):

博主,我的文件夹有几百条这样文件名的表格文件:

jhu-usc.edu_KIRC.HumanMethylation450.2.lvl-3.TCGA-B0-5104-01A-01D-1418-05.txt
jhu-usc.edu_KIRC.HumanMethylation450.2.lvl-3.TCGA-B0-5104-11A-01D-1418-05.txt
jhu-usc.edu_KIRC.HumanMethylation450.2.lvl-3.TCGA-B0-5106-01A-01D-1418-05.txt
jhu-usc.edu_KIRC.HumanMethylation450.2.lvl-3.TCGA-B0-5106-11A-01D-1418-05.txt
jhu-usc.edu_KIRC.HumanMethylation450.2.lvl-3.TCGA-B0-5107-01A-01D-1418-05.txt
jhu-usc.edu_KIRC.HumanMethylation450.2.lvl-3.TCGA-B0-5107-11A-01D-1418-05.txt
jhu-usc.edu_KIRC.HumanMethylation450.2.lvl-3.TCGA-B0-5108-01A-01D-1418-05.txt
jhu-usc.edu_KIRC.HumanMethylation450.2.lvl-3.TCGA-B0-5108-11A-01D-1418-05.txt
jhu-usc.edu_KIRC.HumanMethylation450.2.lvl-3.TCGA-B0-5109-01A-02D-1418-05.txt
jhu-usc.edu_KIRC.HumanMethylation450.2.lvl-3.TCGA-B0-5109-11A-01D-1418-05.txt

前一个数字5104是一个人的代码,后面01A和11A分别是这个人的两份标本。Excel打开后都是这样的模式:

Hybridization REF   TCGA-B0-5104-01A-01D-1418-05    TCGA-B0-5104-01A-01D-1418-05    TCGA-B0-5104-01A-01D-1418-05    TCGA-B0-5104-01A-01D-1418-05
Composite Element REF   Beta_value  Gene_Symbol Chromosome  Genomic_Coordinate
cg00000029  0.450732228872884   RBL2    16  53468112
cg00000108  NA  C3orf35 3   37459206
cg00000109  NA  FNDC3B  3   171916037
cg00000165  0.108395613370022       1   91194674
cg00000236  0.911981104797718   VDAC3   8   42263294
cg00000289  0.707225259319108   ACTN1   14  69341139

我现在想把第一行删除,第3、4、5列也删除。将第二列改名:比如第一个人代码4814,01A的标本改成1T,11A的标本改成1N;第二个人代码4817,01A改成2T,11A改成2N,依此类推。最后按照这个1T,1N,2T,2N。。。。重新建立文件,保存在一个文件夹,文件名和第二列的名字一致:

1N.txt
1T.txt
2N.txt
2T.txt
3N.txt
3T.txt
4N.txt
4T.txt
5N.txt
5T.txt

如何在原始文件存放的地方,使用循环进行操作??因为我有几百个这样的文件。谢谢博主先。

我的答复如下:

谢谢来信。这个用R是很容易办到的。

首先是读取文件列表,用 dir()。得到一个字符串向量,包含了所有文件的文件名。用循环命令,对这些文件逐个操作就行了。

逐个操作:read.table()来读取文件,删除不需要的行和列,names()对列重命名,write.table()把新文件保存。完毕。

代码如下:

wd <- "D:\\temp\\Ldata\\"
filels <- dir(wd)
lc <- regexpr("01A", filels[1])
nameold <- substr(filels, lc, lc+2)
namenew <- ifelse(nameold == "01A", "T", "N")
for (i in 1:length(filels)){
  print(paste("processing", i))
  fileold <- read.table(paste(wd, filels[i], sep = ""), skip = 1, header = TRUE, sep = "\t")
  filenew <- fileold[, 1:2]
  names(filenew)[2] <- paste(ceiling(i/2), namenew[i], sep = "")
  write.table(filenew,file = paste(wd, ceiling(i/2), namenew[i], ".txt", sep = ""), sep = "\t", quote = FALSE, row.names = FALSE)
}

原文链接

comments powered by Disqus