2017-11-19 11 views
-1

編集---私は範囲を小さくするために質問を整理しました。R行を整理して集計する

データフレームを次の形式で集計しようとしていますが、問題が発生しています。

これは、電話システムからのisdnログ出力であるため、ログ全体に同時に発生するコールが含まれています。これらの呼び出しは、発信するのではなく、着信する性質のものです。

データフレームは、以下のようになります。

"V1" "V2""V3""V4" "V5"  "V6"  "V7"     "V8" 
"1" "Oct" "" "2" "00:00:01" "10.20.5.31" "82189056:" "Oct 2 00:00:01.326 AEDST: ISDN Se0/0/0:15 Q931: RX <- SETUP pd = 8 callref = 0x174E " 
"2" "Oct" "" "2" "00:00:01" "10.20.5.31" "82189057:" " Bearer Capability i = 0x8090A3 " 
"3" "Oct" "" "2" "00:00:01" "10.20.5.31" "82189058:" "  Standard = CCITT " 
"4" "Oct" "" "2" "00:00:01" "10.20.5.31" "82189059:" "  Transfer Capability = Speech " 
"5" "Oct" "" "2" "00:00:01" "10.20.5.31" "82189060:" "  Transfer Mode = Circuit " 
"6" "Oct" "" "2" "00:00:01" "10.20.5.31" "82189061:" "  Transfer Rate = 64 kbit/s " 
"7" "Oct" "" "2" "00:00:01" "10.20.5.31" "82189062:" " Channel ID i = 0xA1839B " 
"8" "Oct" "" "2" "00:00:01" "10.20.5.31" "82189063:" "  Preferred, Channel 27 " 
"9" "Oct" "" "2" "00:00:01" "10.20.5.31" "82189064:" " Calling Party Number i = 0x2183, '0' " 
"10" "Oct" "" "2" "00:00:01" "10.20.5.31" "82189065:" "  Plan:ISDN, Type:National " 
"11" "Oct" "" "2" "00:00:01" "10.20.5.31" "82189066:" " Called Party Number i = 0xC1, '' " 
"12" "Oct" "" "2" "00:00:01" "10.20.5.31" "82189067:" "  Plan:ISDN, Type:Subscriber(local) " 
"13" "Oct" "" "2" "00:00:01" "10.20.5.31" "82189068:" " Sending Complete" 
"14" "Oct" "" "2" "00:00:01" "10.20.5.31" "82189069:" "Oct 2 00:00:01.334 AEDST: ISDN Se0/0/0:15 Q931: TX -> CALL_PROC pd = 8 callref = 0x974E " 
"15" "Oct" "" "2" "00:00:01" "10.20.5.31" "82189070:" " Channel ID i = 0xA9839B " 
"16" "Oct" "" "2" "00:00:01" "10.20.5.31" "82189071:" "  Exclusive, Channel 27" 
"17" "Oct" "" "2" "00:00:02" "10.20.5.31" "82189072:" "Oct 2 00:00:01.350 AEDST: ISDN Se0/0/0:15 Q931: TX -> ALERTING pd = 8 callref = 0x974E " 
"18" "Oct" "" "2" "00:00:02" "10.20.5.31" "82189073:" " Progress Ind i = 0x8088 - In-band info or appropriate now available " 
"19" "Oct" "" "2" "00:00:02" "10.20.5.31" "82189074:" "Oct 2 00:00:01.358 AEDST: ISDN Se0/0/0:15 Q931: TX -> CONNECT pd = 8 callref = 0x974E" 
"20" "Oct" "" "2" "00:00:02" "10.20.5.31" "82189075:" "Oct 2 00:00:01.382 AEDST: ISDN Se0/0/0:15 Q931: RX <- CONNECT_ACK pd = 8 callref = 0x174E" 
"21" "Oct" "" "2" "00:00:19" "10.20.5.30" "81488302:" "Oct 2 00:00:18.210 AEDST: ISDN Se0/0/0:15 Q931: TX -> DISCONNECT pd = 8 callref = 0x9AC7 " 
"22" "Oct" "" "2" "00:00:19" "10.20.5.30" "81488303:" " Cause i = 0x8090 - Normal call clearing" 
"23" "Oct" "" "2" "00:00:19" "10.20.5.30" "81488304:" "Oct 2 00:00:18.290 AEDST: ISDN Se0/0/0:15 Q931: RX <- RELEASE pd = 8 callref = 0x1AC7" 
"24" "Oct" "" "2" "00:00:19" "10.20.5.30" "81488305:" "Oct 2 00:00:18.314 AEDST: ISDN Se0/0/0:15 Q931: TX -> RELEASE_COMP pd = 8 callref = 0x9AC7" 
"25" "Oct" "" "2" "00:00:21" "10.20.5.31" "82189076:" "Oct 2 00:00:21.053 AEDST: ISDN Se0/1/0:15 Q931: RX <- SETUP pd = 8 callref = 0x093A " 

私は、データセットは以下のようになりたいと思います:

"V1" "V2""V3""V4" "V5"  "V6"  "V7" "UniqueId"  "V8" 
    "1" "Oct" "" "2" "00:00:01" "10.20.5.31" "82189056:" "0x174E" "Oct 2 00:00:01.326 AEDST: ISDN Se0/0/0:15 Q931: RX <- SETUP pd = 8 callref = 0x174E " 
    "2" "Oct" "" "2" "00:00:01" "10.20.5.31" "82189057:" "0x174E" " Bearer Capability i = 0x8090A3 " 
    "3" "Oct" "" "2" "00:00:01" "10.20.5.31" "82189058:" "0x174E" "  Standard = CCITT " 
    .... 
    "21" "Oct" "" "2" "00:00:19" "10.20.5.30" "81488302:" "0x9AC7" "Oct 2 00:00:18.210 AEDST: ISDN Se0/0/0:15 Q931: TX -> DISCONNECT pd = 8 callref = 0x9AC7 " 

再反復する:

  • コール参照がありますこのデータセットを識別するユニークな方法です。 もcallrefとして0x174E(これはデータセット内でユニークなコール を見つける唯一の方法です)。 これは、要求されたデータフレームの新しい列(UniqueId)です。

  • また、同じcallref idまたは別のcall refのいずれかを示す別の行にヒットするまで、下の行は同じcallref idを新しい列に貼り付けます。

  • callrefが表示されるたびに、これらの行を1つの行に折り畳むことができる人のためのボーナスポイント。

( - > CALL_PROC、TX - > ALERTING、TX - - > CONNECT、RX <。CONNECT_ACKおよびいくつかの他callrefを含む行もTXが含まれている場合)、これは、いくつかの異なる状態で発生する可能性があることに注意してください彼らは、任意の答えが理解されるのと同じcallref

"V1" "V2""V3""V4" "V5"  "V6"  "V7" "UniqueId"  "V8" 
    "1" "Oct" "" "2" "00:00:01" "10.20.5.31" "82189056:" "0x174E" "Oct 2 00:00:01.326 AEDST: ISDN Se0/0/0:15 Q931: RX <- SETUP pd = 8 callref = 0x174E \n Bearer Capability i = 0x8090A3 \n Standard = CCITT" 

に属するよう

は、例えば、私は、行1,2および3のV7列を合成しています。

+1

Rで再生できるように再現可能な例にできますか?私はあなたのデータセットがどのようにレイアウトされているかを理解するのに苦労しています。再現可能な例については、ドキュメントを参照してください。 –

+0

元のテーブルを、テキストファイルにコピーしてからread.table()を使ってrにインポートできる例で変更しました。これはエレガントではないかもしれませんが、これは私が行う方法を知っているものです。この変更が何らかの形で役に立ったらお知らせください。 – treeof

+0

このテキスト形式ではなく、 'dput(log_entry)'の出力で質問を編集してください。これは、データの正確なコピー**を持つようにします。 –

答えて

1

これはちょっと答えが厄介ですが、私は最善を尽くしました。

と同じことをしたので、おそらく私のread.fwfをスキップすることができます。私は、実行可能な形式でデータを取得しようとしていました。

私は最初の列の一部

example1 <- read.fwf("ex.csv", widths = c(1, 6, 10, 10, 10, 1000), strip.white = T) 

を分離する、情報を読み込むには、文字列の代わりの要因にすべてを回し、最初の行ヘッダを除去し、列の名前を変更しました。

example <- example1 %>% 
    mutate_all(.funs = as.character) %>% 
    slice(-1) %>% 
    select(-1, 
     Date = 2, 
     Time = 3, 
     IP = 4, 
     id = 5, 
     Description = 6) 

次に、callrefが発生した最初のスポットにインデックスを付け、それらのテキストブロックでグループ化しました。

x <- which(grepl("callref", example$Description)) 

example <- example %>% 
    mutate(callref = ifelse(grepl("callref", Description), 1, 0), 
     group = rep(x, c(diff(c(x, x))[1:length(x)-1], nrow(.) - x[length(x)]+1))) 

example DFがグループ化された後、私はグループ内の説明過去に、テキストをまとめます。私はこれがあなたが探していた主なものだと思いますか?

example2 <- example %>% 
    group_by(group) %>% 
    summarise(text = paste(Description, collapse = "*")) 

その後、私は戻って、メインexample DFにそれに参加する、と私は、重要な情報の一部を分離して別々の使用します。この方法でRX_TXとcallref idを取得できます。必要な場合は、他の重要な情報を分割して、tidyrのspread機能を使用してその情報を列に変換することをお勧めします。

example3 <- example %>% 
    filter(callref == 1) %>% 
    left_join(example2, by = "group") %>% 
    select(-Description) %>% 
    rename(Description = text) %>% 
    separate(Description, into = c("firstpart", "RX_TX"), sep = "Q931: ") %>% 
    separate(RX_TX, into = c("RX_TX", "Info"), sep = "pd = 8") %>% 
    mutate(Call_Ref = substr(gsub("callref \\= ", "", Info), 1, 8)) 
+0

これはまさに私が探していたものです!私は自分のデータセットに直面する多くのシナリオでこのコードを再利用します。ありがとうございました! – treeof

+0

それはあなたのためにうれしい!これは面白いことでした。 :) –

+0

私はあなたがこの質問を解決する方法のレベルに到達するために、どのように訓練できるかについていくつかのヒントを求めたいと思っていました。私は擬似コードを見つけましたが、要約、担当者、グループといっしょにまとめることはできませんでした。どのようなタイプのトレーニング、リソース、コースをお勧めしますか?あらゆるヒントが高く評価されます。 – treeof

関連する問題