R语言:批量读取数据框和"NA"频数统计

导读

需求: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="":无注释【参数】
\color{green}{读表总遇到莫名其妙的问题时,多加几个参数试试吧。}

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

\color{green}{😀😀原创文章,码字不易,转载请注明出处😀😀}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容