2017-02-21 67 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

相关问题