使用动态移位的源数组填充目标数组

时间:2015-07-27 13:45:51

标签: arrays r

将数组移位每列给定数字的好方法是什么?

我有以下方法用一个不同数组的值填充一个完整大小的数组(" o")(" p",&#中存在所有的dimnames(p) 34; O&#34)

# empty target array 
o <- array(dim=c(6,3),dimnames=list(c(1:6),c(1:3))) 

# partially filled source array
p <- array(c(10:16),dim=c(2,3),dimnames=list(c(2:3),c(1:3)))  
> p
   1  2  3
2 10 12 14
3 11 13 15

# fill target array with p 
o[(match(names(p[,1]),names(o[,1]))),(match(names(p[1,]),names(o[1,])))] <- p 
> o 
   1  2  3 
1 NA NA NA 
2 10 12 14 
3 11 13 15 
4 NA NA NA 
5 NA NA NA 
6 NA NA NA 

现在我想重写匹配的数组调用,将每列移动到列标题中的值(仅为了简化我选择1:3)。

在此示例中,将第一列移动1,将第二列移动2,依此类推)。

结果如下:

   1  2  3 
1 NA NA NA 
2 NA NA NA 
3 10 NA NA 
4 11 12 NA 
5 NA 13 14 
6 NA NA 15 

有没有一种很好的方法可以在不进行手动循环的情况下解决这个问题?

我已经尝试了方向

o[(match(names(p[,1]),as.integer(names(o[,1]))-as.integer(names(o[1,])))),(match(names(p[1,]),names(o[1,])))] <- p

并提取colnames,但后来不得不进入循环。

由于

1 个答案:

答案 0 :(得分:2)

shift <- function(M) {
  #find indices of non-NAs
  ind <- which(!is.na(M), arr.ind = TRUE)
  #create shifted indices
  ind_shifted <- ind
  ind_shifted[, "row"] <- ind_shifted[, "row"] + 
                             as.integer(colnames(M))[ind_shifted[, "col"]]
  #fill matrix with shifted values
  M_shifted <- M + NA
  M_shifted[ind_shifted] <- M[ind]
  M_shifted
}

shift(o)
#   1  2  3
#1 NA NA NA
#2 NA NA NA
#3 10 NA NA
#4 11 12 NA
#5 NA 13 14
#6 NA NA 15

如果您可以使用零而不是NA s(即0不是有效值),则可以使用稀疏矩阵更有效地执行此操作。