2017-12-15 11 views
0

Ich habe einen Datensatz,Erstellen einer Spalte basierend auf Reihen Bedingungen

user_id Gap itr visit_no.(desired column) 
     a 0.3 1   1 
     a 0.5 1   1 
     a 1.5 1   1 
     a 0.9 1   2 
     a 2.6 1   2 
     a 0.34 1   3 
     a 0.8 2   1 
     a 0.34 2   1 
     b 1.6 1   1 
     b 0.7 1   2 
     b 0.8 1   2 
     b 0.7 1   2 
     b 4.8 2   1 
     b 0.39 2   2 
     b 0.38 2   2 
     b 0.89 2   2 

I Spalte erstellen möchten wie folgt aussieht (visit_no.). Immer wenn die Lücke größer als 1 ist, müssen wir visit_no erhöhen. In den nächsten Zeilen wird der Wert um 1 erhöht, und bis wir einen anderen Wert> 1 finden, würden wir die Seriennummer in aufsteigender Reihenfolge fortschreiben. Wenn die Lücke kleiner als 1 ist, würde der Wert von visit_no in vorherigen Reihen von visit_no angegeben. Und visit_no. immer von 1 für einen Benutzer beginnen würde und itr ..Visit_No Säule wurde von user_id und itr

die Datenrahmen

df<-data.frame(user=c("a","a","a","a","a","a","a","a","b","b","b","b","b","b","b","b") 
        , gap=c(0.3,0.5,1.5,0.9,2.6,0.34,0.8,0.34,1.6,0.7,0.8,0.7,4.8,0.39,0.76,0.72), 
        itr=c(1,1,1,1,1,1,2,2,1,1,1,1,2,2,2,2)) 
+1

Können Sie bitte Ihre gewünschte Spalte überarbeiten? Alle Werte einschließen und sicherstellen, dass sie korrekt sind – Sotos

+0

Die gewünschte Ausgabe sieht nicht sehr gut formatiert aus ... ist Gap 0.034 in Zeile 6? Was ist mit all dem a und b in deiner ersten Spalte? Es ist mir nicht ganz klar, was du machen willst. – guscht

+0

Ja 6. Reihe der Lücke ist 0.34 ..... Daten sind richtig formatiert –

Antwort

2
library(dplyr) 

df<-data.frame(user=c("a","a","a","a","a","a","a","a","b","b","b","b","b","b","b","b") 
       , gap=c(0.3,0.5,1.5,0.9,2.6,0.34,0.8,0.34,1.6,0.7,0.8,0.7,4.8,0.39,0.76,0.72), 
       itr=c(1,1,1,1,1,1,2,2,1,1,1,1,2,2,2,2)) 

df %>% 
    group_by(user, itr) %>% 
    mutate(visit_no = cumsum(ifelse(lag(gap, default = 2) > 1, 1, 0))) %>% 
    ungroup() 

# # A tibble: 16 x 4 
#  user gap itr visit_no 
# <fctr> <dbl> <dbl> <dbl> 
# 1  a 0.30  1  1 
# 2  a 0.50  1  1 
# 3  a 1.50  1  1 
# 4  a 0.90  1  2 
# 5  a 2.60  1  2 
# 6  a 0.34  1  3 
# 7  a 0.80  2  1 
# 8  a 0.34  2  1 
# 9  b 1.60  1  1 
# 10  b 0.70  1  2 
# 11  b 0.80  1  2 
# 12  b 0.70  1  2 
# 13  b 4.80  2  1 
# 14  b 0.39  2  2 
# 15  b 0.76  2  2 
# 16  b 0.72  2  2 
1

Das ist so ziemlich das gleiche wie AntoniosK Antwort Dies ist gruppiert werden, aber in data.table, ohne Rohrleitungen Betreiber, und mit data.tableshift-Funktion.

library(data.table) 
dt <- data.table(df) 
dt[, visit_no := cumsum(ifelse(shift(gap, n = 1, type = "lag", fill = 0)>1,1,0)) + 1, by = c("user", "itr")] 
dt 
# user gap itr visit_no 
# 1: a 0.30 1  1 
# 2: a 0.50 1  1 
# 3: a 1.50 1  1 
# 4: a 0.90 1  2 
# 5: a 2.60 1  2 
# 6: a 0.34 1  3 
# 7: a 0.80 2  1 
# 8: a 0.34 2  1 
# 9: b 1.60 1  1 
#10: b 0.70 1  2 
#11: b 0.80 1  2 
#12: b 0.70 1  2 
#13: b 4.80 2  1 
#14: b 0.39 2  2 
#15: b 0.76 2  2 
#16: b 0.72 2  2 
Verwandte Themen