2017-08-09 171 views
-1

我有一个包含100列以上的大矩阵,但并不是所有列都有值只有5或6个连续列在每行中有值,其余都是新生。我想创建一个矩阵,只有5列取5个连续列的值。例如:我想在一个nxm矩阵中创建一个五列的矩阵R

A = [NA NA 1 2 3 4 5 6 NA NA; 1 2 3 4 5 NA NA NA NA NA; NA NA NA NA 1 2 3 4 5 6; NA NA NA 1 2 3 4 5 NA NA]

我想要这个矩阵:

A = [1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5]

谢谢

+0

你应该表现出到目前为止,如果你想获得有意义的帮助,你已经尝试了什么。 – Zach

回答

0
#DATA 
A = structure(c(NA, 1L, NA, NA, NA, 2L, NA, NA, 1L, 3L, NA, NA, 2L, 
4L, NA, 1L, 3L, 5L, 1L, 2L, 4L, NA, 2L, 3L, 5L, NA, 3L, 4L, 6L, 
NA, 4L, 5L, NA, NA, 5L, NA, NA, NA, 6L, NA), .Dim = c(4L, 10L 
)) 

#INPUT 
A 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
#[1,] NA NA 1 2 3 4 5 6 NA NA 
#[2,] 1 2 3 4 5 NA NA NA NA NA 
#[3,] NA NA NA NA 1 2 3 4 5  6 
#[4,] NA NA NA 1 2 3 4 5 NA NA 

的直接的方法是通过将各行去(使用lapplyapply)并提取从各行的前5个非NA元素。

A_out = do.call(rbind, lapply(1:NROW(A), function(i) A[i,][!is.na(A[i,])][1:5])) 

OR

A_out = t(apply(X = A, MARGIN = 1, function(x) x[!is.na(x)][1:5])) 

#OUTPUT 
A_out 
#  [,1] [,2] [,3] [,4] [,5] 
#[1,] 1 2 3 4 5 
#[2,] 1 2 3 4 5 
#[3,] 1 2 3 4 5 
#[4,] 1 2 3 4 5 
+0

感谢您的努力,这对我给出的例子来说非常合适。我还有另一个例子,这有点不同,并且想知道如何做同样的想法!例如,如果其中一行是这样的:A [1,] = [NA 7 NA 9 NA 1 2 3 4 5],我怎样才能得到[1 2 3 4 5]而忽略7和9?所以我只想提取只有当连续5个数字没有任何数字之间的差距!非常感谢 – Zryan