【问题标题】:Why split() in R split matrix into vector and how can I get the matrix result?为什么将 R 中的 split() 拆分为向量,如何获得矩阵结果?
【发布时间】:2016-10-31 02:28:21
【问题描述】:

我想将一个矩阵分成两部分。我使用了以下代码

x <- matrix(rnorm(15),5,3)
idx <- rbinom(5,1,0.5)
split(x,idx)

但是,我得到了两个向量而不是两个矩阵。我知道如果我将 x 转换为 data.frame 会得到我想要的。即

x <- as.data.frame(matrix(rnorm(15),5,3))
idx <- rbinom(5,1,0.5)
split(x,idx)

我想知道有没有什么方法可以不将矩阵转换为数据框并且结果仍然是矩阵格式?为什么会这样?

【问题讨论】:

标签: r matrix split


【解决方案1】:

split.data.frame(x,idx) 可能吗?这将强制split 操作将您的matrix 视为data.frame,而不是作为具有尺寸的vector(基本上描述了matrix)。

显示它的示例给出了基本相同的结果,但返回的是 matrix 而不是 data.frame

set.seed(1)
x <- matrix(rnorm(15),5,3)
idx <- rbinom(5,1,0.5)
split.data.frame(x,idx)
#$`0`
#           [,1]       [,2]       [,3]
#[1,] -0.6264538 -0.8204684  1.5117812
#[2,] -0.8356286  0.7383247 -0.6212406
#[3,]  1.5952808  0.5757814 -2.2146999
#
#$`1`
#          [,1]       [,2]      [,3]
#[1,] 0.1836433  0.4874291 0.3898432
#[2,] 0.3295078 -0.3053884 1.1249309

split(data.frame(x),idx)
#$`0`
#          X1         X2         X3
#1 -0.6264538 -0.8204684  1.5117812
#3 -0.8356286  0.7383247 -0.6212406
#4  1.5952808  0.5757814 -2.2146999
#
#$`1`
#         X1         X2        X3
#2 0.1836433  0.4874291 0.3898432
#5 0.3295078 -0.3053884 1.1249309

【讨论】:

  • 感谢您的解决方案。没有明确我的目的是我的错。由于有效的考虑,我仍然想要存储为矩阵的拆分结果。 split.data.frame() 仍会将每个列表中的结果作为 data.frame。这是我不想得到的。
  • @DavidLee - sapply(split.data.frame(x,idx), is.matrix) 返回 TRUE, TRUE - 结果都是矩阵。根据我通过查看源代码可以确定的任何阶段,也没有内部转换为data.frame
  • 嗨,@thelatemail,这是我的错。你是对的,split.data.frame() 对我有用。
【解决方案2】:

您可以通过行子集来做到这一点。使用您提供的xidx

split_x <- list(x_a= x[idx == 1,], 
                x_b= x[idx != 1,])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 2014-02-07
    • 2013-01-14
    • 1970-01-01
    相关资源
    最近更新 更多