2017-02-21 9 views
4

ベクトル内の連続していない値または最新の非NA値との差を計算するR関数を探しています。我々は最後の訪問からの時間を探しているベクトル内の連続した値または最新の非NA値の計算R

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

: はここに例を示します。

5 NA 5 

、理想的には、それは元のベクトル「の値が同じ長さになります:ザ・は「差分」ベクトルが欲しかった

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

5 NA NA 

:デフを使用して

は、我々は長さ3のベクトルを取得しますDF ''それはデータフレームに追加することができるよう':lagとで

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

べき最後のフレームのdiff列は前のコードブロックのようにNA 5 NA 5であるか?そして、最初のコードブロックの「値」は「訪問」であるべきですか? – Spacedman

+0

@Spacedmanありがとうございました。 – dambach

+0

@Spacedmanこれは修正されました。 – dambach

答えて

2

を繰越ここだけの基本的なRの操作を使用して、一つの方法です。

NASに出チョッピングによる非NAの差分アウト

まず仕事:

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

はその後仕事します彼らは結果の列に行くつもりです。それは理由ラグのNAで第一位を除くすべての非NAの場所となります:

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

は今、NASの列を作成し、適切な場所に差分を埋める:

> 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

あなたが次のことを行うことができますの機能:

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

zooとdplyrパッケージを組み合わせた簡単なソリューション! – dambach

関連する問題