2016-11-17 4 views
0

Ich habe einen Datensatz mit Variablen der kumulativen Zeit, die ich für das Ausfüllen einer Websurvey aufgewendet habe (jede Variable entspricht einer Seite von die Umfrage). Ich brauche die Variablen, um nicht die kumulative Zeit anzuzeigen, sondern die Zeit, die nur auf dieser Seite verbracht wird. Da im Fragebogen Filter vorhanden sind, haben einige Variablen NA, da die Seiten gefiltert werden.Den Wert der ersten Spalte, die nicht NA ist, von der Spalte subtrahieren.

Hier einige Beispieldaten (die erste Variable kann als Basis betrachtet werden und enthält keine NA):

rts5032939 rts5032955 rts5032973 rts5032974 rts5032975 rts5032977 rts5032978 rts5032979 rts5033085 rts5033089 
1   70   99   NA  104  111  119  132  147  175  196 
3   33  144   NA  156  165   NA  199  259  297  357 
15   18   57   NA   63   69   80   99  174  190  221 
20  2107  2126   NA  2131  2139  2209  2220  2236   NA  2274 
24  1088  1111   NA  1117  1124  1133  1152   NA  1208  1228 
30   27   61   NA   70   83   90  182  230  298  336 

Hier ist ein dput() für Sie, mit arbeiten:

test <- structure(list(rts5032939 = c(70, 33, 18, 2107, 1088, 27), rts5032955 = c(99, 
144, 57, 2126, 1111, 61), rts5032973 = c(NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_), rts5032974 = c(104, 
156, 63, 2131, 1117, 70), rts5032975 = c(111, 165, 69, 2139, 
1124, 83), rts5032977 = c(119, NA_real_, 80, 2209, 1133, 90), rts5032978 = c(132, 
199, 99, 2220, 1152, 182), rts5032979 = c(147, 259, 174, 2236, 
NA_real_, 230), rts5033085 = c(175, 297, 190, NA_real_, 1208, 298), rts5033089 = c(196, 
357, 221, 2274, 1228, 336)), .Names = c("rts5032939", "rts5032955", 
"rts5032973", "rts5032974", "rts5032975", "rts5032977", "rts5032978", 
"rts5032979", "rts5033085", "rts5033089"), row.names = c(1L, 
3L, 15L, 20L, 24L, 30L), class = "data.frame") 

Die erwartete Ausgabe sieht so aus. Beachten Sie, dass die Variablen nicht ersetzt werden müssen, ich bin völlig in Ordnung mit neu generierten Variablen.

rts5032939 rts5032955 rts5032973 rts5032974 rts5032975 rts5032977 rts5032978 rts5032979 rts5033085 rts5033089 
1   70   29   NA   5   7   8   13   15   28   21 
3   33  111   NA   12   9   NA   34   60   38   60 
15   18   39   NA   6   6   11   19   75   16   31 
20  2107   19   NA   5   8   70   11   16   NA   38 
24  1088   23   NA   6   7   9   19   NA   56   20 
30   27   34   NA   9   13   7   92   48   68   38 

Bevor ich das Problem mit den NA bemerkt, habe ich

for (i in 2:10) { 
    df1[paste0("t_", i)] <- df1[i]-df1[i-1] 
} 

neue Variablen mit der subtrahierten Zeit zu erzeugen. Offensichtlich funktioniert das nicht, wenn manchmal ein -Wert verwendet wird.

In Anbetracht der Tatsache, dass die NA von Fall zu Fall passiert, muss der neue Ansatz durch die Spalten und die Zeilen durchlaufen. Um ehrlich zu sein, bin ich mir nicht sicher, wie ich hier anfangen soll. Kann mir jemand auf die Richtung hinweisen, wie dies erreicht werden kann? Ich würde mich über einen allgemeinen Rat freuen, von dem ich die Details selbst machen könnte.

Edit: Um zu verdeutlichen, brauche ich den Ausgang, um nur die Differenz zwischen dem Wert und dem Wert des ersten nicht -Wertes, der in dieser Zeile vorkommt, zu sein.

+0

Können Sie zeigen die erwartete Ausgabe – akrun

+0

Ich habe bearbeitet die erwartete Ausgabe in die Frage. – LAP

Antwort

1

Hoffe, das ist besser, aber wird auf jeden Fall langsam sein!

abc <- function(x){ 
    zz = as.numeric(x) 
    w <- 0 
    for (i in 1:length(zz)){ 
    if (i==1){ 
     w[i] = 0 
    } else { 
     w[i] <- zz[i] - zz[max(which(!is.na(zz)[1:i-1]))] 
    } 
    } 
    return(w) 
} 

t(apply(test, 1, abc)) 

Haben Sie die Lösung einen schnelleren Ansatz (gilt mit()) - Lassen Sie mich wissen, wie diese in Bezug auf Geschwindigkeit führt

abc <- function(x){ 
    y = x[!is.na(x)] # get those non -NA values 
    x[!is.na(x)] = c(y[1], diff(y)) # find the diff() of non NA ones and replace them to their original spot 
    return(x) 
} 

t(apply(test, 1, abc)) 
+1

sogar ich werde nach Verbesserung suchen, danke –

+0

yu wissen, wir können einen iterativen Prozess haben, aber wird verdammt langsam sein !! Ich werde versuchen, dass –

+0

Süße, das tut es! Vielen Dank für deine Mühe! Kleinere Sache: Es tötet die Grundlinie Variable (alle 0), aber ich kann nur das Original neu einfügen, so ist es nicht wirklich wichtig. – LAP

Verwandte Themen