我正在尝试将我的 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 正常
如果至少 5 个连续行在“CHR”列和“TYPE”列中具有相同的值,则将所有这些行合并为一行,以便 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 中执行此操作的更简单方法 - 任何包或任何其他技巧?