2016-06-22 3 views
1

J'ai un problème pour connecter deux points avec la même valeur y. Mon jeu de données ressemble à ceci (je l'espère la mise en forme est ok):Connectez deux points avec une ligne dans 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 

Ce que j'ai à ce jour est la suivante:

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") 

qui se traduit par: this Plot

Maintenant, je voulez connecter les points avec la même valeur d'axe y. Et ne peut pas obtenir des lignes ou abline à travailler. Merci d'avance!

EDIT: dput des données

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)) 

Modifier final:

La raison pour laquelle complotant lignes ne marchait pas était, que le type de données min et max était horodatages. La conversion de ces valeurs en valeurs numériques a donné le résultat attendu. Merci pour votre aide tout le monde

+0

L'éditera mais cela semble encore pire. – Wirsiing

Répondre

3

La fonction lines devrait fonctionner correctement. Cependant, vous devrez l'appeler pour chaque paire (ou ensemble) de points qui partagent la même valeur y. Voici un exemple reproductible:

# 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])) 

Ce retour

enter image description here

données

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

Comme il semble que vous avez deux groupes distincts pour lequel vous comme dessiner ces lignes, le fol meuglement serait l'algorithme:

  1. pour chaque groupe, (min et max, je crois)
    • calculer les valeurs en double de la variable y
    • mettre les indicies de ces doublons dans un dupesList (peut-être dupesListMin et dupesListMax).
  2. tracer les points
  3. course d'une fonction sapply sur chaque dupesList.
+0

J'ai besoin de connecter 'x1 <- mydata $ min, y' et' x2 <-mydata $ max, y' comment est-ce que je ferais ça? Merci pour l'aide ! – Wirsiing

+1

Vous voudrez passer par le processus de collecte des indices des valeurs y qui correspondent comme je l'ai fait dans dupesList deux fois, une fois pour les variables min et max. Une fois que ces indices sont rassemblés en deux listes distinctes, utilisez 'spply' pour dessiner les lignes au-dessus du nuage de points. Vous voudrez probablement ajouter l'argument col pour contrôler les couleurs. – lmo

+0

J'ai peur, je n'en sais pas assez sur R pour le faire. Je suppose que je dois créer deux dupesLists et ensuite deux fois sapply? Si je comprends bien, dupeVals est une liste de toutes les valeurs y. dupesList crée alors une liste de toutes les valeurs x qui ont des valeurs y en double.sapply appelle alors des lignes sur tous les x et toutes les valeurs y en double. Je ne comprends tout simplement pas comment il calcule les valeurs x. – Wirsiing