【问题标题】:How can I separate a matrix into smaller ones in R?如何在 R 中将矩阵分成较小的矩阵?
【发布时间】:2012-10-15 03:06:48
【问题描述】:

我有以下矩阵

2    4    1
6    32   1
4    2    1
5    3    2
4    2    2

我想根据第 3 列制作以下两个矩阵

第一

2    4
6    32
4    2

5    3
4    2

我能想到的最好的方法,但我得到一个错误

x

y

【问题讨论】:

标签: r matrix


【解决方案1】:

如果mat 是您的矩阵:

mat <- matrix(1:15,ncol=3)
mat[,3] <- c(1,1,1,2,2)
> mat
     [,1] [,2] [,3]
[1,]    1    6    1
[2,]    2    7    1
[3,]    3    8    1
[4,]    4    9    2
[5,]    5   10    2

那么你可以使用split:

> lapply( split( mat[,1:2], mat[,3] ), matrix, ncol=2)
$`1`
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8

$`2`
     [,1] [,2]
[1,]    4    9
[2,]    5   10

matrixlapply 是必要的,因为 split 会删除使向量成为矩阵的属性,因此您需要将它们重新添加。

【讨论】:

  • +1 我从不使用拆分,但每次看到它我都认为我应该开始。
  • @BrandonBertelsen 谢谢。我已经开始经常使用splitstack——它们很好地互补。
  • @AriB.Friedman - 使用by 查看我的回答,我认为它会保留名称和尺寸。
  • 多年后回到这里,我意识到split.data.frame(mat, mat[,3]) 可以正常工作。
【解决方案2】:

又一个例子:

#test data
mat <- matrix(1:15,ncol=3)
mat[,3] <- c(1,1,1,2,2)

#make a list storing a matrix for each id as components
result <- lapply(by(mat,mat[,3],identity),as.matrix)

最终产品:

> result
$`1`
  V1 V2 V3
1  1  6  1
2  2  7  1
3  3  8  1

$`2`
  V1 V2 V3
4  4  9  2
5  5 10  2

【讨论】:

  • 这是一个很好的答案,因为它不会降低尺寸,不像split
【解决方案3】:

如果你有一个矩阵A,这将在第三列为1时得到前两列:

A[A[,3] == 1,c(1,2)]

您可以使用它来获取第三列中任何值的矩阵。

解释:A[,3] == 1 返回一个布尔向量,如果 A[i,3] 为 1,则第 i 个位置为 TRUE。这个布尔向量可用于索引矩阵提取我们想要的行。

免责声明:我对 R 的经验很少,这是 MATLAB 式的做法。

【讨论】:

    【解决方案4】:

    这是 pedrosorio 想法的功能版本:

     getthird <- function(mat, idx) mat[mat[,3]==idx, 1:2]
     sapply(unique(mat[,3]), getthird, mat=mat)  #idx gets sent the unique values
    #-----------
    [[1]]
         [,1] [,2]
    [1,]    1    6
    [2,]    2    7
    [3,]    3    8
    
    [[2]]
         [,1] [,2]
    [1,]    4    9
    [2,]    5   10
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多