2017-12-11 4 views
-2

Ich habe eine Datentabelle, die finden Index des ersten und des letzten Vorkommens in Datentabelle

|userId|36|37|38|39|40| 
|1|1|0|3|0|0| 
|2|3|0|0|0|1| 

Wo jede nummerierte Spalte (36-40) repräsentieren Woche Zahlen wie

aussieht. Ich möchte die Anzahl der Wochen vor dem ersten Auftreten eines Wertes ungleich Null und der letzten berechnen.

Zum Beispiel, für userId 1 in meinem Datensatz, der erste Wert erscheint in Woche 36, und der letzte erscheint in Woche 38, so ist der Wert, den ich will. Für userId 2 ist es 40-36, was 4 ist.

ich möchte die Daten speichern, wie:

|userId|lifespan| 
|1|2| 
|2|4| 

ich, dies zu tun bin zu kämpfen, kann jemand bitte helfen?

Antwort

2

Allgemeine Methode, die ich nehmen würde, ist es zu schmelzen, konvertieren Sie die Zeichenspaltennamen in numerische, und nehmen Sie das Delta von jeder Benutzer-ID. Hier ist ein Beispiel mit data.table.

library(data.table) 
dt <- fread("userId|36|37|38|39|40 
      1|1|0|3|0|0 
      2|3|0|0|0|1", 
      header = TRUE) 

dt <- melt(dt, id.vars = "userId") 
dt[, variable := as.numeric(as.character(variable))] 
dt 
#  userId variable value 
# 1:  1  36  1 
# 2:  2  36  3 
# 3:  1  37  0 
# 4:  2  37  0 
# 5:  1  38  3 
# 6:  2  38  0 
# 7:  1  39  0 
# 8:  2  39  0 
# 9:  1  40  0 
# 10:  2  40  1 
dt[!value == 0, .(lifespan = max(variable) - min(variable)), by = .(userId)] 
# userId lifespan 
# 1:  1  2 
# 2:  2  4 
+0

Dies ist ex was ich wollte, danke! – Benirving92

0

Hier ist ein dplyr Methode:

df %>% 
    gather(var, value, -userId) %>% 
    mutate(var = as.numeric(sub("X", "", var))) %>% 
    group_by(userId) %>% 
    slice(c(which.max(value!=0), max(which(value!=0)))) %>% 
    summarize(lifespan = var[2]-var[1]) 

Ergebnis:

# A tibble: 2 x 2 
    userId lifespan 
    <int> <dbl> 
1  1  2 
2  2  4 

Daten:

df = read.table(text = "userId|36|37|38|39|40 
1|1|0|3|0|0 
2|3|0|0|0|1", header = TRUE, sep = "|") 
Verwandte Themen