我想將我的一個Perl腳本轉換爲R腳本。我在R A數據幀,它看起來像(忽略的列名) -如果列相同,合併R dataframe中的連續行
CHR START END TYPE chr1 945493 945593 normal chr1 945593 947374 normal chr1 947374 947474 normal chr1 947474 947574 gain chr1 947574 947674 gain chr1 947674 960364 gain chr1 960364 960464 normal chr22 17290491 17290591 normal chr22 17290591 17290691 normal chr22 17290691 17290791 gain chr22 17290791 17292513 gain chr22 17292513 17292613 gain chr22 17292613 17292713 gain chr22 17292713 17293046 gain chr22 17293346 17298475 gain chr22 17298475 17298575 gain chr22 17298575 17298675 normal chr22 17298675 17303632 normal chr22 17303632 17303732 loss chr22 17303732 17303832 normal chrX 154162621 154181221 normal chrX 154181221 154181321 normal chrX 154181321 154181421 loss chrX 154181421 154181521 loss chrX 154181521 154181621 loss chrX 154181621 154181721 loss chrX 154181721 154216867 loss chrX 154216867 154216967 normal chrX 154216967 154217067 normal chrX 154217067 154217167 normal
如果至少連續5行具有在「CHR」列和「類型」列相同的值,然後將所有這些行中一個行,以便START列應該具有第一行的值,END列具有最後一行的值,最後只返回具有「增益」或「損失」類型的行。因此,所需的輸出是:
chr22 17290691 17298575 gain chrX 154181321 154216867 loss
我在做什麼現在的問題是:
- 保存與 「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(看起來相當簡單直接的代碼),並查看是否遇到任何問題? – joran
這就是我想要做的。在Perl中看起來很容易,但我無法弄清楚我該如何在R中執行它。 – Vikas
在你的perl腳本中,你使用'&'(按位AND)而不是'&&'(C形邏輯AND)。我會推薦使用'或'和'和',因爲它們更透明並且優先級更低。 – TLP