我有一个矩阵 Vmat:
v1 = c(4 , 8 , 3 , 5 , 9)
v2 = c(5 , 6 , 6 , 11 , 6)
v3 = c( 5 , 6 , 6 , 11 , 6)
v4= c(8, 6, 4, 4, 3)
v5 = c(4 , 8 , 3 , 5 , 9)
v6= c(8 , 6 , 4 , 4 , 3)
v7 = c( 3 , 2 , 7 , 7 , 4)
v8= c(3 , 2 , 7 , 7 , 4)
row1 = c(v1,v2)
row2 = c(v3,v4)
row3 = c(v5,v6)
row4 = c(v7,v8)
Vmat = rbind(row1,row2,row3,row4)
Vmat
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
row1 4 8 3 5 9 5 6 6 11 6
row2 5 6 6 11 6 8 6 4 4 3
row3 4 8 3 5 9 8 6 4 4 3
row4 3 2 7 7 4 3 2 7 7 4
我想通过将矩阵分成 2 份(n=ncol(Vmat)/2 = 每 5 列)来堆叠矩阵。
所以输出是:
[,1] [,2] [,3] [,4] [,5]
4 8 3 5 9
5 6 6 11 6
4 8 3 5 9
3 2 7 7 4
5 6 6 11 6
8 6 4 4 3
8 6 4 4 3
3 2 7 7 4
最佳答案
这是一个潜在的 data.table 解决方案:
# install.packages("data.table", type="source") # requires 1.9.6+
library(data.table)
vm <- ncol(Vmat)/2
lst <- lapply(1:vm,function(i)c(i,i+vm))
result <- melt(as.data.table(Vmat),measure=lst)[,variable:=NULL]
result
# value1 value2 value3 value4 value5
# 1: 4 8 3 5 9
# 2: 5 6 6 11 6
# 3: 4 8 3 5 9
# 4: 3 2 7 7 4
# 5: 5 6 6 11 6
# 6: 8 6 4 4 3
# 7: 8 6 4 4 3
# 8: 3 2 7 7 4
使用一个更现实的例子:
set.seed(1)
Vmat <- matrix(sample(0:9,16e3*1000,replace=TRUE),nr=16e3)
library(data.table)
system.time({
vm <- ncol(Vmat)/2
lst <- lapply(1:vm,function(i)c(i,i+vm))
result <- melt(as.data.table(Vmat),measure=lst)[,variable:=NULL]
})
# user system elapsed
# 0.3 0.0 0.3
因此,16,000 行 X 1000 列大约需要 0.3 秒。请注意,虽然此“使用 lapply(...)
”,但它仅用于为 melt(...)< 创建
,它完成所有工作。measure.vars
列表
@Akrun 的解决方案(同一系统):
system.time({
n <- ncol(Vmat)/2
ar1 <- array(Vmat, dim=c(nrow(Vmat),n,ncol(Vmat)/n))
ar2 <- aperm(ar1, c(1,3,2))
dim(ar2) <- c(prod(dim(ar1)[c(1,3)]),n)
})
# user system elapsed
# 0.38 0.00 0.37
all.equal(as.matrix(result),ar2,check.attributes=F)
# [1] TRUE
关于r - 堆叠矩阵的每 n 列而不在 R 中应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32793326/