2017-02-21 68 views
4

我正在尋找一個R函數來計算連續值或向量中最新的非NA值之間的差異。 下面是一個例子:計算連續值之間的差異或在向量中使用最新的非NA值R

visit <- c(1,2,3,4) 
time <- c(5,10,NA,15) 
df <- data.frame(visit ,time) 

我們正在尋找自上次訪問的時間。

使用差異,我們得到了一個長度爲3的向量:

diff <- diff(df$time, lag = 1, differences = 1) 

5 NA NA 

在想「差異」矢量爲:

5 NA 5 

理想情況下這將是相同長度的原始載體的價值「所以它可以被添加到數據框 'df,可以':

visit | time | diff 
    1  5  NA 
    2  10  5 
    3  NA  NA 
    4  15  5 
+0

應該根據前面的代碼塊,最後一幀中的差異列是NA 5 NA 5?並且應該在第一個代碼塊中「值」是「訪問」? – Spacedman

+0

@Spacedman是的,當然對不起。 – dambach

+0

@Spacedman這些已被更正。 – dambach

回答

2

這裏有一種方法,只使用基本科研業務:

是先計算出非NA的diff由斬波在NAS出來:

> cdiffs = diff(df$time[!is.na(df$time)]) 

然後工作把它們放在結果欄裏的位置。這將是所有除這是因爲滯後NA首位非NA地方:

> cplace = which(!is.na(df$time))[-1] 

現在創建NAS的一列,並填寫的diff到正確的地方:

> df$diffs = NA 
> df$diffs[cplace] = cdiffs 
> df 
    visit time diffs 
1  1 5 NA 
2  2 10  5 
3  3 NA NA 
4  4 15  5 
+0

使用基本R操作的好且相對直接的解決方案! – dambach

+0

您應該在矢量中沒有NA值的情況下進行測試,因爲它可能會中斷。 – Spacedman

+0

即使在沒有NA值的情況下,它似乎也能工作。 – dambach

2

隨着lagna.locf個功能,你可以做到以下幾點:

lag提供了訪問前值和na.locf代表最後觀察存在下缺少價值的正向

library(zoo)  #for na.locf function 
library(dplyr) #for lag function, (had issues with base lag function) 

DF$newDiff = DF$time - na.locf(lag(DF$time),na.rm = FALSE) 

DF 
# visit time newDiff 
#1  1 5  NA 
#2  2 10  5 
#3  3 NA  NA 
#4  4 15  5 
+0

使用動物園和dplyr軟件包的簡單解決方案! – dambach

相關問題