r - 堆叠矩阵的每 n 列而不在 R 中应用

标签 r matrix dataframe

我有一个矩阵 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/

相关文章:

r - 矩阵到具有行/列数的数据框

python - pd.style.apply 使用多个条件来设置数据框的样式

r - 如何向控制台发送 R 数据帧消息?

r - R 中用于测试文件是否为 ascii 的 native 方法

r - R中的循环赋值

c++ - 当矩阵没有 LU 分解时,如何在 C++ 中求解方阵的线性系统?

python - 为 "Lights out"变体生成切换矩阵

R Markdown 输出大小

r - 如何使用场景向 scatter3D Plotly 绘图添加注释?

c - 为什么我的二维数组有如此奇怪的行为?