【问题标题】:Making a matrix of column means制作列矩阵意味着
【发布时间】:2016-06-04 13:34:20
【问题描述】:

我的数据中有一个列均值向量,如下所示:

cmean <- c(v1=50.99013605,  v2=13.27823129, v3=67.83265306, v4=25.88299320)

    v1             v2              v3              v4 
    50.99013605    13.27823129     67.83265306     25.88299320 

然后我想用它制作一个矩阵,其中所有列都只是列均值的副本。因此我希望它看起来像这样:

    50.99013605    13.27823129     67.83265306     25.88299320 
    50.99013605    13.27823129     67.83265306     25.88299320 
    50.99013605    13.27823129     67.83265306     25.88299320 
    50.99013605    13.27823129     67.83265306     25.88299320 

我尝试了很多使用rep,但我未能很好地将它以这种格式放入矩阵中。最方便的方法是什么?

【问题讨论】:

  • 如果您从 data.frame 开始并希望将每列的所有行都转换为列的均值,您可以使用df[] &lt;- lapply(df, mean)

标签: r


【解决方案1】:

您可以将byrow 参数用于matrix。例如:

> x <- 1:4
> matrix(x, 4, 4, TRUE)
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    1    2    3    4
[3,]    1    2    3    4
[4,]    1    2    3    4

如果不传入TRUE,则默认按列填充矩阵:

> matrix(x, 4, 4)
     [,1] [,2] [,3] [,4]
[1,]    1    1    1    1
[2,]    2    2    2    2
[3,]    3    3    3    3
[4,]    4    4    4    4

【讨论】:

  • 恕我直言,这是最简单的解决方案,但您应该使用 TRUE 而不是 T,因为 R 中的任何内容都不会阻止这种重新定义:T&lt;-FALSE 之后任何事情都可能发生...... ;)
【解决方案2】:

在使用col 复制“v1”后,我们可以使用dim&lt;- 分配维度。

`dim<-`(v1[col(d2)], dim(d2))
#         [,1]     [,2]     [,3]     [,4]
#[1,] 50.99014 13.27823 67.83265 25.88299
#[2,] 50.99014 13.27823 67.83265 25.88299
#[3,] 50.99014 13.27823 67.83265 25.88299
#[4,] 50.99014 13.27823 67.83265 25.88299

或使用replicate

do.call(rbind, replicate(nrow(d2), v1, simplify=FALSE))
#        v1       v2       v3       v4
#[1,] 50.99014 13.27823 67.83265 25.88299
#[2,] 50.99014 13.27823 67.83265 25.88299
#[3,] 50.99014 13.27823 67.83265 25.88299
#[4,] 50.99014 13.27823 67.83265 25.88299

或者一个紧凑的选项是

(d2/d2)*v1[col(d2)]

如果我们使用dplyr

library(dplyr)
d2 %>%
    mutate_each(funs(mean))

其中“d2”是初始数据集,“v1”是其列的意思。

【讨论】:

    【解决方案3】:

    这是rep()的解决方案

    cmean <- c(v1=50.99013605,  v2=13.27823129, v3=67.83265306, v4=25.88299320)
    M <- 5 # number of rows
    matrix(rep(cmean, each=M), M)
    #> matrix(rep(cmean, each=M), M)
    #         [,1]     [,2]     [,3]     [,4]
    #[1,] 50.99014 13.27823 67.83265 25.88299
    #[2,] 50.99014 13.27823 67.83265 25.88299
    #[3,] 50.99014 13.27823 67.83265 25.88299
    #[4,] 50.99014 13.27823 67.83265 25.88299
    #[5,] 50.99014 13.27823 67.83265 25.88299
    

    如果你想复制名字你可以这样做:

    x <- matrix(rep(cmean, each=M), M)
    colnames(x) <- names(cmean)
    

    【讨论】:

    • 既然名字已经被删除了,你最好还是用rep.int()来提高速度。
    猜你喜欢
    • 2017-11-13
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多