2015-02-24 75 views
1

我有一个类似于下面的大数据矩阵(“trial.matrix”)。如何使用R中的diffinv重建具有领先NA的差异数据?

  [,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行)开始应用。我在实际矩阵中有许多列,有些列有主要的NAs,有些列没有。我需要保留重建中的领先新生。我无法找到一种简单的方法,以直观的方式在差异矩阵中重构具有NAs的列。

(对于每一列我能够构建两个向量,一个包含第一非NA列,及其他包含所述第一NA值,但不能找出使用这些的简单方法。)

建议感激。

+0

我不认为这是可能的一般情况。想象你洗牌后的第二列是'c(NA,2,NA,2,NA)' - 如果你需要重建这个向量以外的许多值,你需要重建列吗?你确定你无法通过改变试验矩阵来获得你想要的吗? – 2015-02-24 18:03:54

+0

我应该澄清。我将始终在矩阵的最顶端有主要的NAs。数据中的其他NAs可以使用na.X操作进行处理。这只是我所关注的主要NAs。而且,顶部的新手需要留在那里是有原因的。 – Ernie 2015-02-24 18:06:22

回答

0

,可以暂时代替零的NA:

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 
+0

完美!谢谢。 – Ernie 2015-02-24 18:32:56