2017-10-14 1 views
0

Ich habe eine Datentabelle mit Spalten id, starts, ends, same_personIn Datentabelle, Vergleichen Zeilen und machen Berechnungen ohne Schlaufe in R

same_person verwendet wird, um zu überprüfen, ob die Zeile die gleiche ID wie die hat, bevor .

library(data.table) 
id = c(1,1,2,2) 
starts = c(0,5,0,9) 
ends = c(5,10,9,20) 
same_person = c(0,0,0,0) 
df <- data.table(id, starts, ends, same_person) 

df 
     id starts ends same_person 
# 1: 1  0 5   0 
# 2: 1  5 10   0 
# 3: 2  0 9   0 
# 4: 2  9 20   0 

Die erwarteten Ausgänge sind:

1.Compare id die von zwei aufeinanderfolgenden Zeilen, und wenn sie gleich sind, wie same_person 1.
2.Bei die gleiche Person ersetzen, stellen die gleich starts in die erste Reihe.

Ich verwendete 2 für Schleifen, um sie zu realisieren.

Zuerst habe ich überprüfe id eine Zeile mit der Zeile vor, und wenn gleich, ersetzt same_person als 1.

for (i in 2:nrow(df)){ 
    if(df$id[i] == df$id[i-1]){ 
     df$same_person[i] <- 1 
    } 
    } 

df 
     id starts ends same_person 
# 1: 1  0 5   0 
# 2: 1  5 10   1 
# 3: 2  0 9   0 
# 4: 2  9 20   1 

Basierend auf dem Ergebnis vor, ich starts ändern, wenn sie die gleiche Person sind.

for (i in 1:nrow(df)){ 
    if(df$same_person[i] == 1){ 
    df$starts[i] <- df$starts[i-1]  
    } 
} 


df 
     id starts ends same_person 
# 1: 1  0 5   0 
# 2: 1  0 10   1 
# 3: 2  0 9   0 
# 4: 2  0 20   1 

Da diese Datentabelle eine vereinfachte Version ist, dauert es nicht lange. Aber in meiner echten Arbeit braucht es viel.

Ich frage mich, ob ich die zwei Schritte ohne eine Schleife realisieren kann.

+0

Was ist die erwartete Ausgabe – akrun

+0

Die erwarteten Ergebnisse sind: 1. die 'id' von zwei aufeinander folgenden Reihen vergleichen und, wenn sie gleich sind,' same_person' als 1. 2. Für die gleiche Person zu ersetzen, machen Die Startzeit ist gleich der ersten Zeile. – Harold

Antwort

0

Die erste Zeile findet die Duplikate und dann die nächste Zeile ersetzen die Duplikate der starts von dem ersten Wert, der in der data.frame erscheinen.

df$same_person <- 1 * duplicated(df$id) 
    df$starts[which(df$same_person == 1)] <- 
     df$starts[which(df$same_person == 1) - 1] 
+0

Danke. Was ist, wenn dieselbe 'ID' mehr als zweimal erscheint und ich nur die 'same_person' in der letzten Zeile jeder ID brauche, um 1 zu werden. – Harold

+0

Und was, wenn ich zwei Spalten vergleichen will. Zum Beispiel gibt es keine 'ID'-Spalte, und wenn' beginnt 'in der zweiten Zeile entspricht der' Enden 'Zeit in der ersten Zeile. Sie sind die 'same_person'. – Harold

+0

Wenn Sie die IDs sortiert haben, erhalten Sie in jedem Duplikat "1". – Suren

0

Mit Blick auf Ihre Kommentare scheint es, Sie wollen eine Menge Dinge tun. In diesem Fall kann es besser sein, eine Schleife zu schreiben.

Zuerst finden Sie, was sind die eindeutigen IDs und dann sie behandeln. Folgendes puts 1 ist nur die letzte Reihe von mit demselben id.

unique_ids <- unique(df$id) 
for (uid in unique_ids) { 
    n_rows <- which(df$id == uid) 
    if (length(n_rows) > 2) 
    df$same_person[max(n_rows)] <- 1 
} 
Verwandte Themen