【发布时间】:2012-09-12 20:33:59
【问题描述】:
我正在尝试将我的一个 Perl 脚本转换为 R 脚本。我在 R 中有一个数据框,看起来像(忽略列名)-
CHR 开始结束类型 chr1 945493 945593 正常 chr1 945593 947374 正常 chr1 947374 947474 正常 chr1 947474 947574 增益 chr1 947574 947674 增益 chr1 947674 960364 增益 chr1 960364 960464 正常 chr22 17290491 17290591 正常 chr22 17290591 17290691 正常 chr22 17290691 17290791 增益 chr22 17290791 17292513 增益 chr22 17292513 17292613 增益 chr22 17292613 17292713 增益 chr22 17292713 17293046 增益 chr22 17293346 17298475 增益 chr22 17298475 17298575 增益 chr22 17298575 17298675 正常 chr22 17298675 17303632 正常 chr22 17303632 17303732 损失 chr22 17303732 17303832 正常 chrX 154162621 154181221 正常 chrX 154181221 154181321 正常 chrX 154181321 154181421 损失 chrX 154181421 154181521 损失 chrX 154181521 154181621 损失 chrX 154181621 154181721 损失 chrX 154181721 154216867 损失 chrX 154216867 154216967 正常 chrX 154216967 154217067 正常 chrX 154217067 154217167 正常
如果“CHR”列和“TYPE”列中至少有 5 个连续行具有相同的值,则将所有这些行合并为一行,以便 START 列应具有第一行的值,END 列应具有最后一行的值,并且最后只返回具有“增益”或“损失”类型的行。所以想要的输出是:
chr22 17290691 17298575 增益 chrX 154181321 154216867 损失
我现在正在做的是:
- 使用“write.table”保存数据帧。
-
使用这个 perl 脚本:
open $first, "<",$ARGV[0] or die "Unable to open input file: $!"; my $count=1; $_ = <$first>; chomp; my ($p_key, $p_col1, $p_col2,$p_cnv) = split; while(<$first>) { chomp; my ($key, $col1, $col2,$cnv) = split; if ($key eq $p_key and $cnv eq $p_cnv) { $p_col2 = $col2; $count++; } elsif ($count > 4){ print $p_key,"\t", $p_col1,"\t", $p_col2,"\t", $p_cnv,"\n" if($p_cnv eq "gain" or $p_cnv eq "loss"); ($p_key, $p_col1, $p_col2, $p_cnv) = ($key, $col1, $col2, $cnv); $count=1; } else { ($p_key, $p_col1, $p_col2, $p_cnv) = ($key, $col1, $col2, $cnv); $count=1; } }
我认为这是先保存数据帧然后使用 Perl 脚本的额外步骤。任何人都可以建议在 R 中执行此操作的更简单方法 - 任何包或任何其他技巧?
【问题讨论】:
-
作为第一步,为什么不简单地将 Perl 脚本翻译成 R 语言(看起来很简单的代码),看看是否遇到任何问题?
-
这就是我想做的。在 Perl 中似乎很容易,但我不知道我应该如何在 R 中做到这一点。
-
在您的 perl 脚本中,您使用
&(按位与)而不是&&(C 风格的逻辑与)。我建议改用or和and,因为它们更透明且优先级更低。 -
@TLP:感谢您的建议。