如何使用R中的diffinv与领先的NA重建diff数据?

时间:2015-02-24 17:22:31

标签: r matrix diff cumsum

我有一个类似于下面的大数据矩阵(“trial.matrix”)。

         [,1] [,2]
[1,]    3   NA
[2,]    5   NA
[3,]    7   NA
[4,]    9   10
[5,]   11   12
[6,]   13   14

我的问题要求我对该矩阵的差异版本的某些行进行混洗,然后从混洗的差异矩阵重构矩阵。当我申请diff(trial.matrix)时,我得到:

    [,1] [,2]
[1,]    2   NA
[2,]    2   NA
[3,]    2   NA
[4,]    2    2
[5,]    2    2

要重建原始数据框,我需要使用cumsum()或diffinv(),例如:

new.df <- diffinv(diff(trial.matrix), xi = t(c(3, 10)))

但这给出了:

     [,1] [,2]
[1,]    3   10
[2,]    5   NA
[3,]    7   NA
[4,]    9   NA
[5,]   11   NA
[6,]   13   NA

显然,第2列的起始值(“xi”)必须从第3行(或4?)开始应用。我在真实矩阵中有许多列,其中一些有领先的NA,有些没有。我需要在重建中保留领先的NA。我无法想出一种简单的方法,可以用简单的方式在差分矩阵中重建具有NA的列。

(对于每一列,我能够构造两个向量,一个包含第一个非NA行,另一个包含第一个NA值,但无法找到一种直接使用它们的方法。)

建议表示赞赏。

1 个答案:

答案 0 :(得分:0)

您可以暂时用零替换NAs:

trial.matrix <- matrix(c(seq(3,13,by=2),rep(NA,3),10,12,14),ncol=2)

xi <- apply(trial.matrix,2,function(cl) cl[which(!is.na(cl))[1]])

z2 <- diff(trial.matrix)

# temporarily replace NAs in the second column by zeroes:
nas <- which(is.na(z2[,2]))
z2[nas,2] <- 0

new.df <- diffinv(z2,xi = t(xi))

# return NAs
new.df[nas,2] <- NA

#      [,1] [,2]
# [1,]    3   NA
# [2,]    5   NA
# [3,]    7   NA
# [4,]    9   10
# [5,]   11   12
# [6,]   13   14