r - 计算子字符串中特定字符的数量

标签 r string awk

我有一个包含两列的 8040 行文件,第二列具有可变长度的字符串,范围从 30000 到 200000 个字符(DNA 序列)。 [以下是150个字符的样本]

X:100670000-101060000    TTCCCCAAACAGCAACTTTAAGGAGCAGCTTCCTTTATGATCCCTGATTGCCTCCCCTTTGTTCCCATAACAAGTAGTTTAAATTTTCTGTTAAAGTCCAAACCACATATTTACAATACCTCGCACC

根据第二列每个字符串的长度,我想将每个字符串分成 10 个段(字符串长度的 10%),计算每个段的 G 和 C 的数量,并得到 G 的百分比和 C。

例如,如果我的第二列的第一个条目长度为 39000 个字符,则每个段的长度为 3900 个字符,代码将计算每个段中 G 和 C 的出现次数,将它们相加,然后除以 39000(在这种情况下) ,得到百分比。

我试着用 写这个AWK ,但它不起作用。我得到的输出是完整的字符串,而不是段:
awk '{
bp_length[$2]= length($2);
bin_size[$2]= bp_length[$2]*0.1;

for(i=1;i<=bp_length[$2];i+=bin_size[$2]){
print gsub("G", "G")"\t"gsub("C", "C")}

}'

我得到这个作为输出:
79060 76624

中解决这个问题会更容易吗? R ,如果输出可以表示在一个有 10 列的表中,每列代表每行的 10 个段?

最佳答案

由于您尝试在 awk 中进行此练习,我给你一个awk程序

此示例表明拆分和计数已正确完成:

awk '{l=length($2); binsize=int(l/10) + (l%10!=0)
       for(i=1;i<=l;i+=binsize) {
          str=substr($2,i,binsize)
          print str, gsub("G","",str), gsub("C","",str)
       }
     }' <file>

给我们输出
TTCCCCAAACAGC 1 6
AACTTTAAGGAGC 3 2
AGCTTCCTTTATG 2 3
ATCCCTGATTGCC 2 5
TCCCCTTTGTTCC 1 6
CATAACAAGTAGT 2 2
TTAAATTTTCTGT 1 1
TAAAGTCCAAACC 1 4
ACATATTTACAAT 0 2
ACCTCGCACC 1 6

因此,为了获得百分比:
awk '{ l=length($2); binsize=int(l/10) + (l%10!=0)
       printf "%-24s (length: %7d, binsize: %7d, lastbin: %7d)\n",$1,l,binsize,l%binsize
       j=1;
       for(i=1;i<=l;i+=binsize) {
         str=substr($2,i,binsize)
         printf "segment %0.3d : %6.3f (%%G) %6.3f (%%C)\n", j++,100*gsub("G","",str)/l, 100*gsub("C","",str)/l
       }
     }' <file>

输出是:
X:100670000-101060000    (length:     127, binsize:      13, lastbin:      10)
segment 001 :  0.787 (%G)  4.724 (%C)
segment 002 :  2.362 (%G)  1.575 (%C)
segment 003 :  1.575 (%G)  2.362 (%C)
segment 004 :  1.575 (%G)  3.937 (%C)
segment 005 :  0.787 (%G)  4.724 (%C)
segment 006 :  1.575 (%G)  1.575 (%C)
segment 007 :  0.787 (%G)  0.787 (%C)
segment 008 :  0.787 (%G)  3.150 (%C)
segment 009 :  0.000 (%G)  1.575 (%C)
segment 010 :  0.787 (%G)  4.724 (%C)

关于r - 计算子字符串中特定字符的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48766834/

相关文章:

r - 比较R中的两个向量

c++ - 创建 C 字符串的最佳方法

r 检查 Sys.time() 是否在一天中给定的时间间隔内

r - 沿给定端点和短轴的椭圆获取 n 个点

c++ - 给定数字 block C++ 中的最大可能数

Linux bash脚本逐行删除部分字符串

awk - 使用 awk 打印某些列不匹配的行

bash - 使用 printf 格式化输出 : truncating or padding

R 十六进制颜色在 ggvis 中不起作用

string - 使用 pl/sql 在空值上使用连接级别拆分字符串