2013-05-18 23 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編程時遇到了問題搞清楚如何把2行數據的27列到1行54列數據。

+0

我該如何擺脫重複的行? –

+0

一個數據集中的DIP將與第二個數據集中的SIP相匹配,但僅限於下一個匹配,按UID排序。 –

+0

什麼定義了重複*完全*?如果其他變量相同,只是'SIP'和'DIP'的順序不同? –

回答

1

就可以得到通過merge對應的在同一直線上SIP和DIP記錄:

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字段刪除重複:

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 

因爲去重複依賴於一個循環,如果數據集很大,整個事情可能會非常耗時。

+0

如果這是SQL,則FROM語句如下所示: 'FROM Cyber​​Defense.dbo.flows AS flow1 INNER JOIN Cyber​​Defense.dbo.flows AS flow2 ON flow1.DIP = flow2.SIP AND flow1.SIP = flow2.DIP AND flow1.UID

+0

對於我來說,除了沒有更多數據集的一般解決方案之外,我很難想出任何東西,但我的直覺就是調用'merge',讓它匹配所有的事物,不管UID是什麼,然後調用'subset( df_merged,UID_SIP SchaunW

+0

當我輸入'flows_merged < - merge(flows [,setdiff(colnames(flows),「DIP」)],flows [,setdiff(colnames(flows),「SIP」)],by.x時,Windows GUI崩潰=「SIP」,by.y =「DIP」,all = FALSE,suffixes = c(「1」,「2」))' - 在命令行中使用'-max-mem-size'不起作用。 –

1

在SPSS,我會解決這個(從我可以在你的意見和問題聚集),通過使一個新的ID變量ID其中SIPDIP的滯後值對應於彼此的情況下,再使用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  . 

它不是」 t清除你最初的問題什麼是重複的,但如果你不想重複,你會想擺脫他們之前CASESTOVARS我想象。如果通過對其他變量具有相同的值來定義它,但是隻有可互換的SIPDIP,我在過去做過的一件事是創建兩個新變量,並將較小的值放在第一個新字段中,並將第二個領域的價值較大。例如。

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

然後你就可以使用兩個新ID變量來識別無關原來SIPDIP值的順序重複。