Ich habe zwei data.table
s mit mehreren Spalten als Schlüssel (sie besteht aus den Spalten record
, dstPort
, srcPort
, proto
, dstIP
und srcIP
). Beide haben das gleiche Format.Subtract-Wert aus Daten mit Schlüsseln durch mehrere Spalten in R
dataset_1:
record dstPort srcPort proto dstIP srcIP state timestamp 1: state 80 32768 tcp 192.168.101.5 192.168.101.89 syn 1466580661185059 2: state 80 32768 tcp 192.168.101.5 192.168.101.89 syn_ack 1466520661604781 3: state 80 32768 tcp 192.168.101.5 192.168.101.89 close 1466532661885439 4: state 80 55555 tcp 192.168.101.5 192.168.101.89 syn 1466532661885440
und dataset_2:
record dstPort srcPort proto dstIP srcIP state timestamp 1: state 80 32768 tcp 192.168.101.5 192.168.101.89 established 1466537661727619 2: state 80 32768 tcp 192.168.101.5 192.168.101.89 close 1466532661986891 3: state 80 44444 tcp 192.168.101.5 192.168.101.89 established 1466537661727619
Das Folgende ist, was würde ich für jeden Schlüssel in der Datenmenge tun: Ich möchte um die Datensätze (Zeilen) mit demselben Schlüssel zu finden und wo ein bestimmter Status verfügbar ist ble (d.h. Zustand syn
in Datensatz1 und established
in Datensatz_2). Für diese Datensätze möchte ich die Zeitstempel voneinander subtrahieren. Dh:
Für jeden Schlüssel in dataset_1, das heißt:
state 80 32768 tcp 192.168.101.5 192.168.101.89
für Zustand syn
Zeitstempel 1466580661185059
und Key in dataset_2 gibt:
state 80 32768 tcp 192.168.101.5 192.168.101.89
für Zustand established
gibt Zeitstempel 1466537661727619
Nach dem Subtrahieren von Zeitstempeln: 146658 0661185059-1466537661727619 = 42999457440
Es könnte sein, dass es in Datensatz_2 keinen Datensatz für einen Schlüssel gibt. Aus diesem Grund funktioniert die Sortierung nicht (darauf basieren alle meine Versuche). Ein exemplarischer Versuch ist (nach ihnen Art, welche nicht mehr möglich ist):
dt_state1 <- subset(dt, state == 'established')
dt_state2 <- subset(dt, state == 'syn')
dt_delta_test <- data.table(x=(dt_state1$timestamp/1000)- (dt_state2$timestamp/1000),'timestamp'= dt_state1$timestamp-min(dt_state1$timestamp))
Update 1: @lmo:
F1_in = as.data.table(read.csv(file=Filename, header=TRUE, sep=","))
keys=c("record","dstPort","srcPort","dstIP","srcIP")
state1 = 'syn'
state2 = 'established'
dt_state1 <- subset(F1_in, state == state2)
setkey(dt_state1, keys)
Error in setkeyv(x, cols, verbose = verbose, physical = physical) : some columns are not in the data.table: keys
dt_state2 <- subset(F1_in, state == state1)
setkey(dt_state2, keys)
Error in setkeyv(x, cols, verbose = verbose, physical = physical) : some columns are not in the data.table: keys
dt_state1[dt_state2, timestamp - i.timestamp]
Error in `[.data.table`(dt_state1, dt_state2, timestamp - i.timestamp) :
When i is a data.table (or character vector), x must be keyed (i.e. sorted, and, marked as sorted) so data.table knows which columns to join to and take advantage of x being sorted. Call setkey(x,...) first, see ?setkey.
Ich weiß nicht, warum dieser Fehler auftritt. .
@ toni057 Ihre Lösung ändert nichts für mich (ich musste einige Änderungen vornehmen, weil es einige Fehler verursachte). Ich habe den folgenden Code versucht:
F1_in = as.data.table(read.csv(file=Filename, header=TRUE, sep=","))
keys=c("record","dstPort","srcPort","dstIP","srcIP")
state1 = 'syn'
state2 = 'established'
dt_state1 <- subset(F1_in, state == state2)
setkey(dt_state1, keys)
dt_state2 <- subset(F1_in, state == state1)
setkey(dt_state2, keys)
dt_state1 %>%
filter("state" == 'syn') %>%
left_join(filter(dt_state2, "state" == 'established'), by = keys) %>%
mutate(timestamp_diff = timestamp.x - timestamp.y)
Ich änderte auch die dt des zweiten Filters. Aber es gibt keine Veränderung überhaupt in dt_state1 ..
meine Antwort aktualisiert sehen. Ich habe die Schritte hinzugefügt, die ich vor dem linken Join verwendet habe. Zwei Probleme mit Ihrem Code: 1. Verwenden Sie nicht 'subset', sondern' ''. Dies gilt insbesondere für data.tables, da der Vorteil von "subset" stark reduziert ist. Statt 'dt_state1 <- Teilmenge (F1_in, state == state2)', mache 'dt_state1 <- F1_in [state == 'syn',]' 2. Verwende 'setDT' anstelle von' as.data.table'. Es erstellt eine data.table durch Verweis, die viel effizienter ist. 3. Verwenden Sie 'setkeyv' anstelle von' setkey', wenn Sie mit einem Vektor von Strings arbeiten. – lmo