导读
需求:1. 读取一个目录下的所有数据表;2. 统计特定元素的非"NA"的频数,并汇总到一个表中。方法:使用R语言read.table读取数据表,list保存数据表,sum统计元素频数,write.table保存结果、for循环批量操作每一个数据表等等。
一、查看数据表
Linux中查看文件信息
ls -alh
# 查看所有文件名,如下:
总用量 3.9M
drwxrwxr-x 2 cheng WST 4.0K 10月 18 15:46 .
drwxrwxr-x 8 cheng WST 4.0K 10月 16 16:12 ..
-rw-rw-r-- 1 cheng WST 197K 10月 16 11:00 bin.25.tsv
-rw-rw-r-- 1 cheng WST 122K 10月 16 11:00 bin.33.tsv
-rw-rw-r-- 1 cheng WST 176K 10月 16 11:00 bin.36.tsv
-rw-rw-r-- 1 cheng WST 153K 10月 16 11:00 bin.37.tsv
-rw-rw-r-- 1 cheng WST 260K 10月 16 11:00 bin.38.tsv
-rw-rw-r-- 1 cheng WST 253K 10月 16 11:00 bin.39.tsv
-rw-rw-r-- 1 cheng WST 217K 10月 16 11:00 bin.43.tsv
-rw-rw-r-- 1 cheng WST 81K 10月 16 11:00 bin.46.tsv
-rw-rw-r-- 1 cheng WST 228K 10月 16 11:00 bin.50.tsv
-rw-rw-r-- 1 cheng WST 114K 10月 16 11:00 bin.56.tsv
-rw-rw-r-- 1 cheng WST 237K 10月 16 11:00 bin.58.tsv
-rw-rw-r-- 1 cheng WST 152K 10月 16 11:00 bin.61.tsv
-rw-rw-r-- 1 cheng WST 238K 10月 16 11:00 bin.63.tsv
-rw-rw-r-- 1 cheng WST 144K 10月 16 11:00 bin.65.tsv
-rw-rw-r-- 1 cheng WST 102K 10月 16 11:00 bin.66.tsv
-rw-rw-r-- 1 cheng WST 371K 10月 16 11:00 bin.67.tsv
-rw-rw-r-- 1 cheng WST 87K 10月 16 11:00 bin.71.tsv
-rw-rw-r-- 1 cheng WST 198K 10月 16 11:00 bin.81.tsv
-rw-rw-r-- 1 cheng WST 114K 10月 16 11:00 bin.89.tsv
-rw-rw-r-- 1 cheng WST 171K 10月 16 11:00 bin.91.tsv
-rw-rw-r-- 1 cheng WST 279K 10月 16 11:00 bin.94.tsv
head bin.25.tsv
# 查看文件格式,如下:
locus_tag ftype length_bp gene EC_number COG product
LBILEGMC_00001 CDS 324 hypothetical protein
LBILEGMC_00002 CDS 2589 tmoS_1 2.7.13.3 Sensor histidine kinase TmoS
LBILEGMC_00003 CDS 852 hypothetical protein
LBILEGMC_00004 CDS 1164 hypothetical protein
LBILEGMC_00005 CDS 1356 hypothetical protein
LBILEGMC_00006 CDS 975 2.5.1.10 COG0142 (2E,6E)-farnesyl diphosphate synthase
LBILEGMC_00007 CDS 708 hypothetical protein
LBILEGMC_00008 CDS 780 dtd3_1 3.1.1.96 D-aminoacyl-tRNA deacylase
LBILEGMC_00009 CDS 699 guaA_1 6.3.5.2 GMP synthase [glutamine-hydrolyzing]
二、读取文件名
list.files:读取工作目录下所有文件名
strsplit:切割字符串
as.character:将strsplit结果【list】转成字符【character】
for循环:批处理
files=list.files(pattern="bin.*.tsv")
# 读取所有文件的全名,含后缀
name=vector()
for(i in 1:length(files))
{
name[i]=as.character(strsplit(files[i], split=".tsv"))
# 批量提取文件名
}
name
# 查看文件名,如下:
[1] "bin.25" "bin.33" "bin.36" "bin.37" "bin.38" "bin.39" "bin.43" "bin.46"
[9] "bin.50" "bin.56" "bin.58" "bin.61" "bin.63" "bin.65" "bin.66" "bin.67"
[17] "bin.71" "bin.81" "bin.89" "bin.91" "bin.94"
length(name)
# 一共21个文件
[1] 21
三、读取数据表/框
for循环:批处理
list:用列表保存所有数据表信息
read.table:读表函数
sep='\t':制表符分隔【参数】
na.string="":空为NA【参数】
stringsAsFactors=F:不把字符串的列辨认成因子【参数】
header=T:第一行为表头【参数】
quote="":无引号【参数】
comment.char="":无注释【参数】
ml=list()
# 创建一个新列表,存放每个数据框的数据。
for(i in 1:length(files))
{
ml[[i]]=read.table(files[i], sep='\t', na.string="", stringsAsFactors=F, header=T, quote="", comment.char="")
# 读取所有数据框
}
length(ml)
# 一共21个
[1] 21
head(ml[[1]])
# 挑一个检查,没啥毛病,如下:
locus_tag ftype length_bp gene EC_number COG
1 LBILEGMC_00001 CDS 324 <NA> <NA> <NA>
2 LBILEGMC_00002 CDS 2589 tmoS_1 2.7.13.3 <NA>
3 LBILEGMC_00003 CDS 852 <NA> <NA> <NA>
4 LBILEGMC_00004 CDS 1164 <NA> <NA> <NA>
5 LBILEGMC_00005 CDS 1356 <NA> <NA> <NA>
6 LBILEGMC_00006 CDS 975 <NA> 2.5.1.10 COG0142
product
1 hypothetical protein
2 Sensor histidine kinase TmoS
3 hypothetical protein
4 hypothetical protein
5 hypothetical protein
6 (2E,6E)-farnesyl diphosphate synthase
四、统计“gene”非"NA"的数量
head(ml[[1]]["gene"])
# 查看需要统计的信息,计算非<NA>的基因数量:
gene
1 <NA>
2 tmoS_1
3 <NA>
4 <NA>
5 <NA>
6 <NA>
gene_num=vector()
# 创建一个新向量,存放列表中每个数据框的gene数量。
for(i in 1:length(files))
{
gene_num[i]=lengths(ml[[i]]["gene"])-sum(is.na(ml[[i]]["gene"]))
# 基因总数/BIN:
# is.na判断是否为NA
# gene数/数据框=gene列长度/数据框-NA数/数据框
}
length(gene_num)
# 每个数据框一个gene数
[1] 21
gene_num
# 查看每个数据框的“gene”数量,如下:
[1] 1559 1303 1755 1319 2054 2636 2372 806 1972 1023 1754 1445 2276 1287 896
[16] 3349 839 1593 1016 1750 2397
五、结果合并、保存
data.frame:可合并多个向量成表
write.table:保存数据表/框
sep="\t":制表符分隔【参数】
row.names=F:去行标【参数】
quote=F:去引号【参数】
name
# 查看:
[1] "bin.25" "bin.33" "bin.36" "bin.37" "bin.38" "bin.39" "bin.43" "bin.46"
[9] "bin.50" "bin.56" "bin.58" "bin.61" "bin.63" "bin.65" "bin.66" "bin.67"
[17] "bin.71" "bin.81" "bin.89" "bin.91" "bin.94"
gene_num
# 查看:
[1] 1559 1303 1755 1319 2054 2636 2372 806 1972 1023 1754 1445 2276 1287 896
[16] 3349 839 1593 1016 1750 2397
result=data.frame(name, gene_num)
# 合并
result
# 查看:
name gene_num
1 bin.25 1559
2 bin.33 1303
3 bin.36 1755
4 bin.37 1319
5 bin.38 2054
6 bin.39 2636
7 bin.43 2372
8 bin.46 806
9 bin.50 1972
10 bin.56 1023
11 bin.58 1754
12 bin.61 1445
13 bin.63 2276
14 bin.65 1287
15 bin.66 896
16 bin.67 3349
17 bin.71 839
18 bin.81 1593
19 bin.89 1016
20 bin.91 1750
21 bin.94 2397
write.table(result, file="gene.tsv", sep="\t", row.names=F, quote=F)
# 保存结果到当前工作目录
Linux中查看gene.tsv文件
cat gene.tsv
# 结果没毛病,如下:
name gene_num
bin.25 1559
bin.33 1303
bin.36 1755
bin.37 1319
bin.38 2054
bin.39 2636
bin.43 2372
bin.46 806
bin.50 1972
bin.56 1023
bin.58 1754
bin.61 1445
bin.63 2276
bin.65 1287
bin.66 896
bin.67 3349
bin.71 839
bin.81 1593
bin.89 1016
bin.91 1750
bin.94 2397