【问题标题】:Find number of occurences of a string in a matrix [closed]查找矩阵中字符串的出现次数[关闭]
【发布时间】:2014-10-28 05:38:05
【问题描述】:

从下表中我想总结第 1 列中 miRNA 的次数 有一个正值和负值(第 3 列),然后将其绘制为条形图。

我已经发出了这个命令,但是它对值求和而不是计算出现次数:

awk '{x[$1 " " $2]+=$3} END{for (r in x)print r,x[r]}'

示例:

miRNA           target          value

mmu-miR-423-3p  NM_198167       0.7999
mmu-miR-744-5p  NM_001166476    0.79927
mmu-miR-423-5p  NM_146188      -0.79503
mmu-miR-423-3p  NM_172262      -0.79463
mmu-miR-3968    NM_001185020    0.79367
mmu-miR-298-5p  NM_175127       0.79357
mmu-miR-423-5p  NM_009320      -0.7934
mmu-miR-423-5p  NM_015732       0.7928
....

output:

miRNA           positive           negative
mmu-miR-423-3p  1                  1
mmu-miR-423-5p  1                  2

【问题讨论】:

  • 使用哈希是解决这个问题的惯用方式(在 Perl 中)。
  • 编辑了一个我试过的 awk

标签: r perl awk


【解决方案1】:
$ awk '
{ $3<0 ? neg[$1]++ : pos[$1]++ }
END {
    fmt = "%-16s%-10s%s\n"
    printf fmt, "miRNA", "positive", "negative"
    for (rna in pos)
        if (rna in neg)
            printf fmt, rna, pos[rna], neg[rna]
}
' file
miRNA           positive  negative
mmu-miR-423-3p  1         1
mmu-miR-423-5p  1         2

【讨论】:

  • +1 以获得简洁的解决方案。我会把它简化为一个漂亮的三元运算符$3&lt;0 ? neg[$1]++ : pos[$1]++。仅作记录,perl 解决方案在这里并不完全公正。 ;)
  • 我认为除了在作业或打印的右侧之外,我从未使用过三元表达式,我从未真正想到要使用它。我想我喜欢它,只需要说服自己它不会混淆代码。我刚刚决定我确实喜欢它,并且生成的代码很清楚,所以我更新了我的答案。谢谢!
【解决方案2】:

在 R 中尝试:

ddf$sign = ifelse(ddf$value<0,"neg","pos")
with(ddf, table(miRNA, sign))
                sign
miRNA            neg pos
  mmu-miR-298-5p   0   1
  mmu-miR-3968     0   1
  mmu-miR-423-3p   1   1
  mmu-miR-423-5p   2   1
  mmu-miR-744-5p   0   1

【讨论】:

    【解决方案3】:

    Perl 解决方案:

    use strict;
    use warnings;
    
    my %dataCoutner;
    foreach my $line (<DATA>) {
        chomp($line);
        next if($line =~ /^miRNA/);
        my @data = split /\s+/,$line;
        if($data[2] < 0) {
            $dataCoutner{$data[0]}->{'neg'}++;
        }
        else {
            $dataCoutner{$data[0]}->{'pos'}++;
        }
    }
    print "miRNA\tpositive\tnegative\n";
    foreach my $key (sort keys %dataCoutner) {
        print "$key\t" . ($dataCoutner{$key}->{'pos'} // 0) . "\t" . ($dataCoutner{$key}->{'neg'} // 0) . "\n";
    }
    
    __DATA__
    miRNA           target          value
    mmu-miR-423-3p  NM_198167       0.7999
    mmu-miR-744-5p  NM_001166476    0.79927
    mmu-miR-423-5p  NM_146188      -0.79503
    mmu-miR-423-3p  NM_172262      -0.79463
    mmu-miR-3968    NM_001185020    0.79367
    mmu-miR-298-5p  NM_175127       0.79357
    mmu-miR-423-5p  NM_009320      -0.7934
    mmu-miR-423-5p  NM_015732       0.7928
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-13
      • 2021-03-19
      • 1970-01-01
      • 2013-04-21
      • 1970-01-01
      • 2018-01-30
      • 2021-02-25
      相关资源
      最近更新 更多