2016-03-22 46 views
-2

所以我有一個數據集,看起來像這樣:如何統計兩次發生的頻率?

2,1,10,2,0 
2,1,23,2,1 
2,3,6,2,0 
5,1,4,3,0 
5,2,2,2,0 
5,2,2,3,1 
5,2,8,1,2 
5,3,6,3,1 
8,2,12,1,0 

我想有Perl打印的最後一個值在每一行的第2個值的每次出現。因此,例如,它是我的目標是有它打印以下:

2 1: 0 1 
2 3: 0 
5 1: 0 
5 2: 0 1 2 
5 3: 1 
8 2: 0 

我如何告訴Perl來打印行的最後一個值的數字配對的每次出現?

+0

你實際上是試圖算作你的標題所暗示的每個置換的頻率是多少? – ThisSuitIsBlackNot

+0

我需要對頻率進行計數,以便告訴perl針對每個配對的每個頻率執行一次。 (如果這有什麼意義) –

+0

好的,那麼這與你的問題的主體有什麼關係?我沒有看到任何有關計數頻率的內容。我希望'2,1'的頻率爲2,而不是'0 1',因爲'2,1'在您的採樣數據中出現兩次。 – ThisSuitIsBlackNot

回答

0
use strict; 
#use Data::Dumper; 
my $h; 

while (<>){ 
    chomp; 
    my @linechars = split /,/; 
    #Use the first two characters of the input line as the key to a hash. 
    my $key = $linechars[0]." ".$linechars[1]; 
    #stick the last character into an array for this key 
    push @{$h->{$key}}, $linechars[4]; 
} 

#print Dumper($h); 

foreach my $key (keys%{$h}){ 
    print "$key:"; 
    foreach (@{$h->{$key}}) 
    { 
     print " $_"; 
    } 
    print "\n"; 
} 

給人

-bash-3.2$ perl tmp.pl tmp.txt 
5 1: 0 
2 3: 0 
8 2: 0 
2 1: 0 1 
5 2: 0 1 2 
5 3: 1 

如果你只是想頻率,替換

foreach (@{$h->{$key}}) 
    { 
     print " $_"; 
    } 

print scalar (@{$h->{$key}})."\n" 
+0

非常感謝你!現在我的問題是'$ h'是什麼?數據集是? –

+0

是的,$ h是數據集。這是一個散列,由每行中的前兩個字符鍵入。每個鍵值對的值都是一個數組,每次在您的文件中出現該鍵時都會包含一個遞增數字[0,1,2 ...]。這個數組的大小就是密鑰的頻率。如果取消註釋這兩個Data :: Dumper行,您將看到創建了哪些數據結構。 – user1717259

+0

哦好吧,那麼如果數據集存儲在文件中,那麼該如何工作,我們需要調用該文件?你會打開($ h,'<',filename)'並調用該$ h嗎? –

0

不知道你的頻率是什麼意思,但是這個代碼

#!perl 
use strict; 
use warnings; 

generate_output(2, 1); 
generate_output(2, 3); 
generate_output(5, 1); 
generate_output(5, 2); 
generate_output(5, 3); 
generate_output(8, 2); 

sub generate_output 
{ 
    my ($a, $b) = @_; 

    print "$a $b:"; 

    my $data_start = tell DATA; 

    while (<DATA>) { 
     chomp; 
     my @columns = split /,/; 
     if ($columns[0] == $a and $columns[1] == $b) 
     { 
      print " ", $columns[-1]; 
     } 
    } 
    print "\n"; 
    seek DATA, $data_start, 0; 
} 

__DATA__ 
2,1,10,2,0 
2,1,23,2,1 
2,3,6,2,0 
5,1,4,3,0 
5,2,2,2,0 
5,2,2,3,1 
5,2,8,1,2 
5,3,6,3,1 
8,2,12,1,0 

產生你想要的輸出:

2 1: 0 1 
2 3: 0 
5 1: 0 
5 2: 0 1 2 
5 3: 1 
8 2: 0 
+0

這有很大的幫助,但我需要它來檢查當前的前2個元素是否與先前的前2個元素相同(我發現這幾乎是不可能的),但給了一個提示讓程序找出在數據集中進行配對,然後讓珍珠打印多次確切的每一行的最後一個值,然後執行下一個配對。如果是由我自己清理它爲我有什麼,並把它轉換成它,但它不是想要的。因此我只是簡單地要求找到一組數字的頻率,然後我就可以實現它。儘管如此,感謝您的幫助!:) –

+0

目前還不清楚您想要什麼 - 您是否可以更新您的問題以添加您期望的輸入和輸出示例? –