2

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

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

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

4

2 回答 2

1

在 SPSS 中,我将通过创建一个新的 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      .

从您最初的问题中不清楚什么是重复项CASESTOVARS,但是如果您不想要重复项,您将希望在我想象之前摆脱它们。如果它是通过对其他变量具有相同的值来定义的,但只是使用可互换的SIPand DIP,我过去做过的一件事是创建两个新变量,并将较小的值放在第一个新字段中,将较大的值在第二个领域。例如

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

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

于 2013-05-19T13:07:53.797 回答
1

您可以通过以下方式获取同一线路上对应的 SIP 和 DIP 记录merge

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

因为重复数据删除依赖于循环,所以如果您的数据集很大,整个过程可能会变得非常耗时。

于 2013-05-18T23:19:26.167 回答