2016-11-17 24 views
0

我有一個數據集,其中包含累積時間用於填寫websurvey的變量(每個變量對應一頁該調查)。我需要顯示的變量不是累計時間,而是僅顯示在該頁面上的時間。不幸的是,由於調查表中有過濾器,由於頁面被過濾,一些變量有NA從列中減去第一列的數值,而不是數據返回的數據。框架

下面是一些示例數據(第一變量可以被看作是一個基準,不包括任何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 

這裏有一個dput()爲您一起工作:

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") 

預期的輸出如下所示。請注意,變量不一定要被替換,我對新生成的變量完全沒問題。

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 

之前,我與NA注意到這個問題,我用

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

產生與時間減去新變量。顯然,這在有時會使用NA值時不起作用。

考慮到NA按情況發生,新方法必須循環遍歷行的行。說實話,我甚至不知道如何從這裏開始。任何人都可以指出我如何實現這一目標的方向?我很樂意提供一些關於我可以自己做具體細節的一般建議。

編輯:爲了澄清,我需要的輸出只是該值與第一個非值的差值 - NA - 在該行之前出現的值。

+0

你能顯示預期的輸出 – akrun

+0

我已經編輯預期的輸出到問題中。 – LAP

回答

1

希望這會更好,但肯定會變慢!

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)) 

得到使用更快的方法解決方案(使用申請()) - 讓我知道如何在執行速度方面

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

即使我會尋求改善,謝謝 –

+0

俞曉明,我們可以有一個迭代的過程,但將是該死的慢!我會嘗試 –

+0

甜蜜,就是這樣!非常感謝您的努力!次要的事情:它殺死了基線變量(全0),但我可以重新插入原始數據,所以它並不重要。 – LAP

相關問題