2016-06-22 44 views
1

Ich habe ein Problem, zwei Punkte mit dem gleichen y-Wert zu verbinden. Mein-Datensatz sieht wie folgt aus (ich hoffe, dass die Formatierung ok ist):Verbinden Sie zwei Punkte mit einer Linie in R

attackerip,min,max 
125.88.146.123,2016-03-29 17:38:17.949778,2016-03-30 07:28:47.912983 
58.218.205.101,2016-04-05 15:53:20.69986,2016-05-12 17:32:08.583255 
183.3.202.195,2016-04-05 15:58:27.862509,2016-04-15 18:15:13.117774 
58.218.199.166,2016-04-05 16:09:34.448588,2016-04-24 06:02:12.237922 
58.218.204.107,2016-04-05 16:57:17.624509,2016-05-31 00:52:44.007908 

Was ich habe, so weit ist die folgende:

mydata = read.csv("timeline.csv", sep=',') 
mydata$min <- strptime(as.character(mydata$min), format='%Y-%m-%d %H:%M:%S') 
mydata$max <- strptime(as.character(mydata$max), format='%Y-%m-%d %H:%M:%S') 
plot(mydata$min, mydata$attackerip, col="red") 
points(mydata$max, mydata$attackerip, col="blue") 

was zur Folge hat: this Plot

Now I möchte die Punkte mit dem gleichen y-Achsenwert verbinden. Und kann keine Linien oder Linien zur Arbeit bekommen. Danke im Voraus!

EDIT: dput Daten

dput(mydata) 
structure(list(attackerip = structure(c(1L, 5L, 2L, 3L, 4L), .Label = c("125.88.146.123", 
"183.3.202.195", "58.218.199.166", "58.218.204.107", "58.218.205.101" 
), class = "factor"), min = structure(1:5, .Label = c("2016-03-29 17:38:17.949778", 
"2016-04-05 15:53:20.69986", "2016-04-05 15:58:27.862509", "2016-04-05 16:09:34.448588", 
"2016-04-05 16:57:17.624509"), class = "factor"), max = structure(c(1L, 
4L, 2L, 3L, 5L), .Label = c("2016-03-30 07:28:47.912983", "2016-04-15 18:15:13.117774", 
"2016-04-24 06:02:12.237922", "2016-05-12 17:32:08.583255", "2016-05-31 00:52:44.007908" 
), class = "factor")), .Names = c("attackerip", "min", "max"), class = "data.frame", row.names = c(NA, 
-5L)) 

Finale Edit:

Der Grund, warum Plotten Linien funktionierte nicht, war, dass der Datentyp von Min- und Max-Zeitstempel war. Wenn Sie diese Werte in numerische Werte umwandeln, erhalten Sie das erwartete Ergebnis. Danke für Ihre Hilfe alle

+0

Wird es bearbeiten, aber das sieht noch schlimmer aus. – Wirsiing

Antwort

3

Die lines Funktion sollte gut funktionieren. Sie müssen es jedoch für jedes Paar (oder jeden Satz) von Punkten aufrufen, die denselben y-Wert haben. Hier ist ein reproduzierbares Beispiel:

# get sets of observations with the same y value 
dupeVals <- unique(y[duplicated(y) | duplicated(y, fromLast=T)]) 
# put the corresponding indices into a list 
dupesList <- lapply(dupeVals, function(i) which(y == i)) 

# scatter plot 
plot(x, y) 
# plot the lines using sapply 
sapply(dupesList, function(i) lines(x[i], y[i])) 

Das gibt

enter image description here

Daten

set.seed(1234) 
x <- sort(5* runif(30)) 
y <- sample(25, 30, replace=T) 

Wie es scheint, dass Sie zwei separate Gruppen, für die Sie wie zeichnen Sie diese Zeilen, fol gende würde der Algorithmus sein:

  1. für jede Gruppe (min und max, glaube ich)
    • die doppelten Werte der y-Variable
    • in eine dupesList setzen die indicies dieser Duplikate berechnen (vielleicht dupesListMin und dupesListMax).
  2. Plot die Punkte
  3. Lauf einer sapply Funktion für jeden dupesList.
+0

Ich muss 'x1 Wirsiing

+1

Sie möchten den Vorgang des Sammelns der Indizes der Y-Werte, die übereinstimmen, wie ich in DuPesList zweimal, einmal für die Min- und die Max-Variablen durchgehen. Sobald diese Indizes in zwei separaten Listen gesammelt sind, verwenden Sie "sapply", um die Linien über dem Punktdiagramm zu zeichnen. Wahrscheinlich wollen Sie das col-Argument hinzufügen, um die Farben zu steuern. – lmo

+0

Ich fürchte, ich weiß nicht genug über R, um das zu tun. Ich nehme an, ich muss zwei DupesLists erstellen und dann zweimal sapply? Wenn ich es richtig verstehe, ist dupevals eine Liste aller y-Werte. dupesList erstellt dann eine Liste aller x-Werte mit doppelten y-Werten.Sapply ruft dann Linien auf allen x- und allen duplizierten y-Werten auf. Ich verstehe einfach nicht, wie es die x-Werte berechnet. – Wirsiing