2017-03-13 2 views
1

Ich versuche, 2 verschiedene Felder über aufeinanderfolgende Zeilen auf einem Datenrahmen in R zu vergleichen und anzugeben, die unterschiedlich sind. Im Folgenden finden Sie die Eingabedaten: -In R, Vergleichen von 2 Feldern über 2 Zeilen in einem Datenrahmen

Start End 
1 Atl  Bos  
2 Bos  Har 
3 Har  NYC 
4 Stf  SFO 
5 SFO  Chi 

Ich versuche, eine Kette von Bewegung aufzubauen und wo das Ende nicht auf den Beginn der nächsten Zeile ich diese Zeile angeben wollen übereinstimmen bis zu. Also für die oben würde ich Reihe 4, wie unten angeben: -

Start End Ind 
1 Atl  Bos Y 
2 Bos  Har Y 
3 Har  NYC Y 
4 Stf  SFO N 
5 SFO  Chi Y 

Ich bin ziemlich neu in R, ich habe versucht, dieses Problem zu suchen, aber kann nicht scheinen, um eine Lösung zu finden. Jede Hilfe wird geschätzt.

Antwort

2

Eine Alternative wäre:

> Ind <- as.character(dat$Start[-1]) == as.character(dat$End [-length(dat$End)]) 
> dat$Ind <- c(NA, ifelse(Ind==TRUE, "Y", "N")) 
> dat 
    Start End Ind 
1 Atl Bos <NA> 
2 Bos Har Y 
3 Har NYC Y 
4 Stf SFO N 
5 SFO Chi Y 

Beachten Sie, dass Ihr erstes Element <NA>

+0

Sie würden wahrscheinlich besser dran, entweder machen beiden Spalten char oder die Faktorstufen Einstellung das gleiche sein, die Werte in den beiden Spalten unter Berücksichtigung gehört zum selben Pool (und nicht tun 'as.character' on the fly für jede solche Operation). – Frank

+0

Danke @Jilber, das ist genau das, was ich gesucht habe. Obwohl, wenn es Ihnen nichts ausmacht, eine kurze Erklärung. Ich bin nicht ganz klar am Teil der Logik ** dat $ End [-length (dat $ End)]) **. Mir ist nicht ganz klar, was es macht. – rkadam

+0

Danke @Frank Ich werde den Ratschlag verwenden, um den Code effizienter zu machen. – rkadam

0

Sie, dass mit dplyr mit mutate und lead tun soll. Beachten Sie, dass der letzte Eintrag NA sein sollte, da es keine Zeile 6 gibt, mit der SFO-CHI verglichen werden kann.

library(dplyr) 
df1 <- read.table(text=" Start End 
Atl  Bos 
Bos  Har 
Har  NYC 
Stf  SFO 
SFO  Chi", header=TRUE, stringsAsFactors=FALSE) 

df1 %>% 
mutate(Ind=ifelse(End==lead(Start),"Y","N")) 

    Start End Ind 
1 Atl Bos Y 
2 Bos Har Y 
3 Har NYC N 
4 Stf SFO Y 
5 SFO Chi <NA> 
+0

Danke @P Lapointe. Ich sehe was du da machst. Die einzige Sache ist, dass ich das "N" Kennzeichen auf der Reihe benötige, in der der Start nicht mit dem Ende der vorherigen Reihe übereinstimmt. Die Lösung von @Jilber oben trifft den Nagel auf den Kopf. Aber bei der Verwendung von dplyr kann ich Ihren Code leicht an meine Bedürfnisse anpassen. – rkadam

+0

Ja, ändere 'lead' in' lag' und es sollte funktionieren wie du es willst. –

+0

@P Lapointe, Nizza. Das klingt gut!!! – rkadam

Verwandte Themen