今天一早,收到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)
}