【问题标题】:Is there a straight forward way to exchange columns in R?有没有直接的方法来交换 R 中的列?
【发布时间】:2016-09-06 09:55:31
【问题描述】:

我想知道是否有一种直接的方法可以在R 中交换matrix 的任何一对列。

假设我们要交换矩阵中的第一列 (i=1) 和第三列 (j=3)

n=3
mat  <- matrix(1:(n^2),ncol=n)

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

无论矩阵的大小n如何,以下始终有效

i=1; j=3
mat2     <- mat[,i]
mat[,i]  <- mat[,j]
mat[,j]  <- mat2

而像cbind(mat[,3],mat[,2],mat[,1])(在早期线程SO1SO2 中建议)这样的直接命令仅限于给定的n

有没有更直接的方法来交换大小为n 的矩阵中的两列ij

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    可以使用旋转索引来完成列旋转。假设您有矩阵 matn 列,并且您想要旋转列 ij,您可以这样做:

    piv <- 1:n; piv[c(i,j)] <- as.integer(c(j,i))
    mat <- mat[, piv]
    

    as.integer 调用是为了提高内存效率。 piv &lt;- 1:n 是一个整数向量,如果 ij 是双精度数,只需调用 piv[c(i,j)] &lt;- c(j,i) 将导致 piv 首先被复制到双精度数向量中,然后被更新。

    【讨论】:

    • 大约相同的代码长度但不会创建第二个可能很大的矩阵
    • 创建整个矩阵的副本。 mat[, c(i, j)] &lt;- mat[, c(j, i)] 可能会更好。另外,不确定你需要什么 as.integer 在 2 长度向量上
    • 无论如何它都会复制整个内容。我能想到的唯一方法是避免复制它与 data.table 一起使用,比如 library(data.table) ; mat &lt;- as.data.table(matrix(1:(n^2),ncol=n)) ; setcolorder(mat, piv) 这可能不适合 OP 的需求
    • @DavidArenburg 我认为您可以(至少部分)通过使用稀疏矩阵来避免复制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    相关资源
    最近更新 更多