我有很多 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 列数据。
我有很多 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 列数据。
在 SPSS 中,我将通过创建一个新的 id 变量来解决这个问题(从我可以在您的评论和问题中收集到的内容),以识别滞后值SIP
和DIP
彼此对应的情况,然后使用它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
,但是如果您不想要重复项,您将希望在我想象之前摆脱它们。如果它是通过对其他变量具有相同的值来定义的,但只是使用可互换的SIP
and DIP
,我过去做过的一件事是创建两个新变量,并将较小的值放在第一个新字段中,将较大的值在第二个领域。例如
DO IF SID >= DID.
compute ID1 = DID.
compute ID2 = SID.
ELSE.
compute ID1 = SID.
compute ID2 = DID.
END IF.
然后,您可以使用这两个新ID
变量来识别重复项,而不管原始变量SIP
和DIP
值的顺序如何。
您可以通过以下方式获取同一线路上对应的 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
因为重复数据删除依赖于循环,所以如果您的数据集很大,整个过程可能会变得非常耗时。