【问题标题】:How do I pair up rows of network traffic data in R or SPSS?如何在 R 或 SPSS 中配对网络流量数据行?
【发布时间】:2013-05-18 20:58:04
【问题描述】:

我有很多 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 列数据。

【问题讨论】:

  • 如何去除重复的行?
  • 一个数据集中的 DIP 将与第二个数据集中的 SIP 匹配,但只匹配下一个匹配,按 UID 排序。
  • 什么定义了重复的确切?如果其他变量相同,只是SIPDIP的顺序不同?
  • 是回流的,所以有不同的端口,时间稍微往后。我认为我应该说冗余而不是重复。

标签: r analysis spss network-traffic


【解决方案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

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

【讨论】:

  • 如果这是 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 &lt; flow2.UID我如何确保正确的行被配对?
  • 在没有更多数据集的情况下,我很难想出比通用解决方案更多的东西,但我的直觉是只需调用 merge,让它匹配所有内容,无论 UID 是什么,然后调用subset(df_merged, UID_SIP &lt; UID_DIP) 删除所有错误匹配。根据数据集的大小,先合并后过滤可能不切实际。
  • 当我输入 flows_merged &lt;- merge(flows[,setdiff(colnames(flows), "DIP")], flows[,setdiff(colnames(flows), "SIP")], by.x = "SIP", by.y = "DIP", all = FALSE, suffixes = c("1", "2")) 时 Windows GUI 崩溃 - 在命令行中使用 --max-mem-size 无效。
  • 嗯。这可能是一个普通的 R-runs-out-of-memory 问题。你的数据集有多大?正如我在上一条评论中所说,先合并再过滤可能不切实际(或者,显然是不可行的)。这意味着您需要首先找到一种过滤方法 - 我需要查看更多数据才能进行尝试。
【解决方案2】:

在 SPSS 中,我将通过创建一个新的 id 变量来识别 SIPDIP 的滞后值彼此对应的情况,从而解决这个问题(根据我可以在您的 cmets 和问题中收集的信息) ,然后使用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.

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多