2017-07-04 3 views
0

Stellen Sie sich vor, ich habe einen Datenrahmen, der Informationen für verschiedene Personen und deren Standort enthält.Pfad erstellen, ohne Zeilen durch Datenrahmen zu durchlaufen

Jetzt möchte ich einen neuen Datenrahmen haben, der mir sagt, wie die Person gereist ist. Es sollte irgendwie so aussehen:

Person From To 
A  Ber Mun 
A  Mun Stu 
B  LA NY 

ich es mit durch Schleifen über den Datenrahmen tun könnte. Aber ich möchte das für mehrere Millionen Zeilen machen. Hat jemand keinen besseren Weg?

Best, Felix

Antwort

1

Wir data.table verwenden können. Konvertieren Sie den 'data.frame' in 'data.table', gruppiert nach 'Person', ändern Sie 'Place' in 'From' und erstellen Sie 'To', indem Sie den 'Lead' von 'Place' übernehmen und entfernen Sie die Zeilen wo es NA in ‚To‘

library(data.table) 
setDT(df)[ ,.(From = Place, To =shift(Place, type = 'lead')), Person][!is.na(To)] 
# Person From To 
#1:  A Ber Mun 
#2:  A Mun Stu 
#3:  B LA NY 

Es kann auch mit tidyverse

library(dplyr) 
df %>% 
    group_by(Person) %>% 
    transmute(From = Place, To = lead(Place)) %>% 
    filter(!is.na(To)) 
# A tibble: 3 x 3 
# Groups: Person [2] 
# Person From To 
# <chr> <chr> <chr> 
#1  A Ber Mun 
#2  A Mun Stu 
#3  B LA NY 
+1

Großartig, ich wusste, es gab einen viel besseren Weg! Ich habe versucht, dich zu wählen, aber anscheinend ist mein Ruf unten 15. – Felix

+0

@Felix Danke für den Hinweis. Sie können auch [hier] (https://stackoverflow.com/help/someone-answers) überprüfen – akrun

1

ich habe zwei Untergruppen der df nebeneinander, eine ohne den Kopf, eine ohne getan werden der Schwanz, und dann behalte ich das Ergebnis nur, wenn die Person auf jeder Seite gleich ist:

library(magrittr) 
df2 <- df[-nrow(df),] %>% 
    cbind(df[-1,]) %>% 
    setNames(c("Person","From","Person2","To")) %>% 
    subset(Person == Person2) %>% 
    '['(,-3) 

# Person From To 
# 1  A Ber Mun 
# 2  A Mun Stu 
# 4  B LA NY 
Verwandte Themen