抱歉,我想不出一个更具信息性的标题,但这是我的挑战。我有一个矩阵,我需要根据向量描述的参数在特定位置添加列。例如,如果我有以下矩阵:
1, 0, 1, 2, 0
0, 0, 1, 1, 1
1, 1, 0, 0, 0
2, 0, 1, 0, 2
但对于特定的R包(未标记),我需要在特定位置添加NA列。我有一个与矩阵中的列相关的向量:
1, 1, 1, 2, 3
这表明第1-3列来自相同的采样周期,第4列和第5列来自不同的采样周期。我需要使矩阵中的列数等于相同采样周期中的最大数量乘以采样周期数。在这种情况下,有三个1(向量中任何唯一值的最大数量)和总共三个采样周期(向量中的最大数量)。所以我需要一个9列(3 x 3)的矩阵。具体来说,我需要在第4和第5列之后添加新的NAs列。基本上,我只需要将NA列作为占位符,以获得矩阵,其中每个采样周期的观察数(每列)相同(= 3)(由向量中的数字表示)。这很难描述,但在这个想象的例子中,我想最终得到:
1, 0, 1, 2, NA, NA, 0, NA, NA
0, 0, 1, 1, NA, NA, 1, NA, NA
1, 1, 0, 0, NA, NA, 0, NA, NA
2, 0, 1, 0, NA, NA, 2, NA, NA
这将通过看起来像的矢量来描述:
1, 1, 1, 2, 2, 2, 3, 3, 3
虽然我实际上并不需要生成那个矢量,只需要生成矩阵。显然,在这种情况下很容易添加这些列,但对于我的数据,我有一个更大的矩阵,最终会有~200列。另外,我可能不得不为大量数据集执行此操作。
任何人都可以帮我一个在R中编码的方法,以便我可以自动化扩展矩阵的过程吗?
感谢您提出任何意见或建议!
编辑: 为了使事情与我的实际数据更相似,这里是一个可重现的矩阵和向量,类似于我现在的:
m <- matrix(rpois(120*26, 1), nrow = 120, ncol = 26)
v <- c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 5, 5, 6, 6, 6, 6, 7)
答案 0 :(得分:4)
假设m
是矩阵且v
是向量,您可以使用类似
t = table(v)
size = dim(m)[1] * max(t) # size of each block based on the longest
matrix(unlist(lapply(names(t), function(i) {
x = m[, v == i] # get the short block
c(x, rep(NA, size - length(x))) # extend it to size
})), dim(m)[1])
答案 1 :(得分:1)
按照你假设矩阵为mat的方式修改矩阵:
nr <- nrow(mat)
nas <- rep(NA, nr)
l <- lapply( 4:ncol(mat), function(x) matrix(c(mat[,x],nas,nas), nrow = nr) )
cbind(mat[,1:3], do.call(cbind,l))