2017-11-19 1 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 " 

: 아래와 같은

dataframe 보이는하기

"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 또는 다른 호출 참조를 나타내는 다른 행에 도달 할 때까지 동일한 callref id를 새 열에 붙여 넣습니다.

  • callref가 표시 될 때마다이 줄을 한 줄로 축소 할 수있는 사용자를위한 보너스 포인트입니다.

(-> CALL_PROC, TX -> ALERTING, TX - -> CONNECT, RX <. CONNECT_ACK과 몇 가지 다른 callref이 포함 된 행은 또한 TX 포함 된 경우)이 몇 가지 다른 상태에서 일어날 수 있습니다 그들이 어떤 응답을 평가된다

"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" 

동일한 callref에 속하는 것처럼

예를 들어, I 행 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가 발생한 첫 번째 지점을 색인화 한 다음 해당 텍스트 블록별로 그룹화했습니다. example DF 그룹화 한 후

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))) 

, 나는 그룹 내에서 설명 과거, 텍스트를 요약한다. 이게 당신이하려는 주요한 일이라고 생각 해요?

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

그 후 나는 다시 메인 example 안양에 다시 가입, 나는 중요한 정보의 일부를 분리하는 별도의 사용합니다. 이 방법으로 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