2013-05-18 7 views
2

У меня есть много данных потока SiLK, которые я хотел бы использовать для интеллектуального анализа данных. Похоже, что столбец IP-адреса назначения соответствует столбцу исходного IP-адреса строки данных ниже. Строки (со многими более столбцами) выглядят следующим образом:Как объединить строки данных сетевого трафика в R или SPSS?

 
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

Как избавиться от повторяющихся строк? –

+0

DIP в одном наборе данных должен быть сопоставлен с SIP во втором наборе данных, но только в следующем матче, отсортированном по UID. –

+0

Что определяет дубликат * точно *? Если другие переменные одинаковы, то только 'SIP' и' DIP' находятся в другом порядке? –

ответ

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 

Поскольку де- обман опирается на цикл, все это может стать очень трудоемким, если ваш набор данных большой.

+0

Если это был 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

+0

Мне трудно придумать что-то большее, чем общее решение, не содержащее больше набора данных, но моей интуицией было бы просто называть «merge», пусть это соответствует всем, независимо от того, что были UID, а затем называть «subset (df_merged, UID_SIP SchaunW

+0

Сбой интерфейса Windows при вводе в 'flow_merged <- merge (flow [, setdiff (colnames (flow)," DIP ")], flow [, setdiff (colnames (потоки)," SIP ")], by.x = "SIP", by.y = "DIP", all = FALSE, суффиксы = c ("1", "2")) '- использование' --max-mem-size' в командной строке не влияет. –

1

В SPSS я бы занялся этим (из того, что я могу собрать в ваших комментариях и вопросах), сделав новую идентификационную переменную ID для случаев, когда отстающие значения и 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 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  . 

Это ISN» t ясно из вашего первоначального вопроса , что дубликат, но если вы не хотите дубликатов, вы захотите избавиться от них до CASESTOVARS. Если он определяется одинаковыми значениями для других переменных, но только с взаимозаменяемыми SIP и DIP, одна вещь, которую я делал в прошлом, состоит в том, чтобы создать две новые переменные и поместить меньшее значение в первое новое поле и большее значение во втором поле. Например.

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

Затем вы можете использовать два новых ID переменные для выявления дубликатов независимо от порядка исходных SIP и DIP значений.