2013-05-18 4 views
2

나는 많은 데이터 마이닝을하고 싶습니다 SiLK 흐름 데이터가 많이 있습니다. 대상 IP 열이 데이터 행의 원본 IP 열과 더 일치하는 것처럼 보입니다.R 또는 SPSS에서 네트워크 트래픽 데이터 행을 어떻게 페어링합니까?

 
UID SIP DIP PROTOCOL SPORT DPORT 
720107626538 1207697420 3232248333 17 53 7722 
720108826800 3232248333 1207697420 17 47904 53 

나는 R 또는 SPSS에서 프로그래밍 적이과 문제의 54 열 1 행에 데이터의 27 열 2 개 행을 설정하는 방법을 파악하는 데 문제 : (더 많은 열) 행은 다음과 같이 데이터.

+0

중복 행을 제거하는 방법은 무엇입니까? –

+0

하나의 데이터 세트의 DIP는 두 번째 데이터 세트의 SIP와 일치하지만 UID로 정렬 된 바로 다음 일치입니다. –

+0

복제물 *을 정확히 정의하는 것은 무엇입니까? 다른 변수가 같으면'SIP'와'DIP' 만 다른 순서로 나타 납니까? –

답변

1

할 수 있습니다 얻을 merge을 통해 같은 줄에 SIP 및 DIP 기록을 해당 :

for(i in 2:nrow(df_merged)) { 
    ind <- df_merged$UID_DIP 
    ind[i] <- df_merged$UID_SIP[i] 
    df_merged <- df_merged[!duplicated(ind),] 
} 

df_merged 

df_merged 
     SIP  UID_SIP PROTOCOL_SIP SPORT_SIP DPORT_SIP  UID_DIP PROTOCOL_DIP SPORT_DIP DPORT_DIP 
1 1207697420 720107626538   17  53  7722 720108826800   17  47904  53 

디가 있기 때문에 :

df <- data.frame(
    "UID" = c(720107626538, 720108826800), 
    "SIP" = c(1207697420, 3232248333), 
    "DIP" = c(3232248333, 1207697420), 
    "PROTOCOL" = c(17, 17), 
    "SPORT" = c(53, 47904), 
    "DPORT" = c(7722, 53), 
    stringsAsFactors = FALSE) 

df_merged <- merge(
    df[,setdiff(colnames(df), "DIP")], 
    df[,setdiff(colnames(df), "SIP")], 
    by.x = "SIP", 
    by.y = "DIP", 
    all = FALSE, 
    suffixes = c("_SIP", "_DIP")) 

그 후, 당신은 중복을 제거하기 위해 UID 필드를 사용할 수 있습니다 duping은 루프에 의존하기 때문에 데이터 세트가 큰 경우 모든 작업에 많은 시간이 소요될 수 있습니다.

+0

이것이 SQL 인 경우 FROM 문은 다음과 같습니다. FROM CyberDefense.dbo.flows AS flow1 INNER JOIN CyberDefense.dbo.flows AS flow2 ON flow1.DIP = flow2.SIP AND flow1.SIP = flow2.DIP AND flow1.UID

+0

더 많은 데이터 집합이없는 일반적인 솔루션 이상을 생각해 내기 란 어렵지만, 직감은 '병합'을 호출하고 UID가 무엇이든 상관없이 모든 것을 매치시킨 다음 하위 집합 df_merged, UID_SIP SchaunW

+0

'flows_merged <- 병합 (flows [, setdiff (colnames (flows), DIP)], flows [, setdiff (colnames (flows), "SIP")] by.x를 입력하면 Windows GUI가 충돌합니다. = "DIP", 모두 = 거짓, 접미사 = c ("1", "2"))'명령 행에서'--max-mem-size'를 사용하면 효과가 없습니다. –

1

SPSS, 나는 다음 ID로 SIPDIP의 지연된 값이 서로에 해당하는 경우를 새로운 id 변수를함으로써, (나는 여러분의 의견과 질문에 무엇을 수집 할 수 있습니다에서)이 태클, 그리고 것 CASESTOVARS을 사용하여 데이터를 길게에서 길게 바꿉니다.

******************************************************************. 
*Fake data that looks like yours. 
data list free/UID SIP DIP PROTOCOL SPORT. 
begin data 
1 1207697420 3232248333 17 53 
2 3232248333 1207697420 17 47904 
3 1 2 5 6 
4 2 1 3 2 
5 1 3 0 1 
6 1 4 8 9 
end data. 

*Can make our own new id to reshape. 
DO IF $casenum = 1. 
    compute new_id = 1. 
ELSE IF SIP = lag(DIP) and DIP = lag(SIP). 
    compute new_id = lag(new_id). 
ELSE. 
    compute new_id = lag(new_id) + 1. 
END IF. 

*then reshape from long to wide. 
CASESTOVARS 
/ID new_id. 
LIST. 
******************************************************************. 

당신이 당신의 의견에 말했듯이 "하나 개의 데이터 세트의 DIP 두 번째 데이터 세트에서 SIP에 일치하는 것입니다,하지만 바로 다음 경기, UID으로 분류"고, 가정한다. 최종 결과는 다음과 같습니다 (누락 된 데이터를 나타내는 마침표가 있음).

NEW_ID UID.1 UID.2 SIP.1 SIP.2 DIP.1 DIP.2 PROTOCOL.1 PROTOCOL.2 SPORT.1 SPORT.2

1.00  1.00  2.00 1.2E+009 3.2E+009 3.2E+009 1.2E+009  17.00  17.00  53.00 47904.00 
2.00  3.00  4.00  1.00  2.00  2.00  1.00  5.00  3.00  6.00  2.00 
3.00  5.00  .  1.00  .  3.00  .   .00  .  1.00  . 
4.00  6.00  .  1.00  .  4.00  .  8.00  .  9.00  . 

그것은 '외설 귀하의 초기 질문에서 명확한 대답 어떤 중복은입니다. 그러나 중복을 원하지 않으면 CASESTOVARS 전에 상상해보십시오. 다른 변수에 대해 동일한 값을 가졌지 만 교환 가능한 SIPDIP으로 정의 된 경우, 내가 한 일은 두 개의 새 변수를 만들고 첫 번째 새 필드에 더 작은 값을 배치하는 것입니다. 두 번째 필드에서 더 큰 값. 예 :

DO IF SID >= DID. 
    compute ID1 = DID. 
    compute ID2 = SID. 
ELSE. 
    compute ID1 = SID. 
    compute ID2 = DID. 
END IF. 

그럼 당신은 원래 SIPDIP 값의 순서에 관계없이 중복을 식별하기 위해 두 개의 새로운 ID 변수를 사용할 수 있습니다.