【问题标题】:R: changing dimensions of matrixR:改变矩阵的维度
【发布时间】:2014-03-16 14:46:39
【问题描述】:

我有以下数据集:

day <- c(rep(17,4), rep(18,2))
beep <- c(74.50, 77.50, 89.50, 75.25, 58.25, 81.25)
m <- cbind(day, beep)
m
     day  beep
[1,]  17 74.50
[2,]  17 77.50
[3,]  17 89.50
[4,]  17 75.25
[5,]  18 58.25
[6,]  18 81.25

我想要将此数据集转换为以天数(在本例中为 2)作为列数的矩阵。这就是它想要的样子:

      [,1]  [,2]
[1,] 74.50 58.25
[2,] 77.50 81.25
[3,] 89.50    NA
[4,] 75.25    NA

由于此人在第 1 天发出 4 次哔声,在第 2 天发出 2 次哔声,因此矩阵中必然有 2 个 NA。我很想知道如何在此转换上述数据集,而无需像现在制作示例那样手动调整它。

【问题讨论】:

  • 将您的数据转换为该格式似乎是个坏主意(恕我直言)。我能问一下你为什么要这样做吗?是这样您以后可以逐列或逐行处理数据吗?如果您告诉我们更多有关您的最终目标的信息,肯定会有更好的方法。
  • @flodel:我想为每个参与者制作一个矩阵,以天数为列,并用哔哔声填充它。之后,我的意思是用 abind() 将这些矩阵附加到一个数组中。这就是为什么我想改变我的尺寸。我需要一个数组来将我的数据加载到 JAGS 中进行研究。

标签: r matrix dimension


【解决方案1】:

我同意@flodel 的评论,但这里有一个方法:

m2 <- unstack(m, beep~day)
nrow <- max(sapply(m2, length))
m2 <- sapply(m2, function(x) {
  length(x) <- nrow
  x
})

#        17    18
#[1,] 74.50 58.25
#[2,] 77.50 81.25
#[3,] 89.50    NA
#[4,] 75.25    NA

【讨论】:

    【解决方案2】:

    您也可以使用stats 包中的reshape 函数,但您需要将matrix 转换为data.frame 并将data.frame 转换为matrix。但我认为这是更灵活的方式,因为您为要负责列的变量创建 id(在您的情况下)。

    m.df<-as.data.frame(m) ## convert to data.frame
    m.df$id<-ave(m.df$day,m.df$day,FUN=seq_along) ### create index with ave function (more solutions: http://stackoverflow.com/questions/8997638/numbering-by-groups )
    m2<-reshape(m.df,idvar='id',timevar='day',direction='wide') ## reshape data timevar is responsible for columns and with direction you tell how data set should be expaned.
    as.matrix(m2) ### convert back to matrix
    

    【讨论】:

      【解决方案3】:

      假设矩阵的暗度已知,这可能比其他方法更简单。

      n <- m[, "beep"]
      length(n) <- 8 # Since n is a vector with 6 elements, this will make it 8 element- 
                     # vector with two NAs attached.
      dim(n) <- c(4, 2)  # change the dimension of the vector to a 4 by 2 matrix
      print(n)
      
            [,1]  [,2]
      [1,] 74.50 58.25
      [2,] 77.50 81.25
      [3,] 89.50    NA
      [4,] 75.25    NA
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-03
        • 2021-05-07
        • 2021-08-31
        相关资源
        最近更新 更多