如何在R或SPSS中配对网络流量数据行?

时间:2013-05-18 20:58:05

标签: r analysis spss network-traffic

我有很多SiLK流数据,我想做一些数据挖掘。看起来目标IP列与下一行数据的源IP列匹配。行(包含更多列)如下所示:

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

我从未在R或SPSS中编程,并且无法弄清楚如何将2行27列数据转换为1行54列数据。

2 个答案:

答案 0 :(得分: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

由于重复数据删除依赖于循环,如果数据集很大,整个过程可能非常耗时。

答案 1 :(得分: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   议定书.1议定书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,我过去做过的一件事就是创建两个新变量,然后放置较小的变量第一个新字段中的值和第二个字段中的较大值。 E.g。

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

然后,您可以使用两个新的ID变量来识别重复项,无论原始SIPDIP值的顺序如何。