我有很多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列数据。
答案 0 :(得分:1)
您可以通过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
由于重复数据删除依赖于循环,如果数据集很大,整个过程可能非常耗时。
答案 1 :(得分:1)
在SPSS中,我会解决这个问题(我可以在你的评论和问题中收集),通过将新的id变量设为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 议定书.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
之前摆脱它们。如果通过为其他变量设置相同的值来定义,但只使用可互换的SIP
和DIP
,我过去做过的一件事就是创建两个新变量,然后放置较小的变量第一个新字段中的值和第二个字段中的较大值。 E.g。
DO IF SID >= DID.
compute ID1 = DID.
compute ID2 = SID.
ELSE.
compute ID1 = SID.
compute ID2 = DID.
END IF.
然后,您可以使用两个新的ID
变量来识别重复项,无论原始SIP
和DIP
值的顺序如何。