【问题标题】:Most efficient way to create matrix of averages [duplicate]创建平均值矩阵的最有效方法[重复]
【发布时间】:2016-08-12 09:02:18
【问题描述】:

这里是非常基本的问题!在 10 x 2 数据帧上,我想计算每列的平均值并将结果放入一个新的 1 x 2 矩阵中。

colmeans 计算平均值,但将结果放在 2 x 1 向量中。 尝试转置向量会给出错误消息“转置错误(AverageX):l 必须是一个列表。”

作为一种解决方法,我创建了一个空的 1 x 2 矩阵(填充了 NA),然后使用 rbind 将平均向量与空矩阵合并,然后删除了 NA。

它有效,但我敢打赌用两行代码而不是四行代码也可以做到。有人有更好的方法来实现这一目标吗?非常感谢您的帮助。

df <- data.frame(Price = c(1219, 1218, 1220, 1216, 1217, 1218, 1218, 1207, 1206, 1205), XXX = c( 1218, 1218, 1219, 1218, 1221,  1217 , 1217, 1216, 1219, 1216))

Average <- colMeans(df, na.rm = TRUE) #result is a vector => turn it into a 1xm matrix
AverageMatrix <- matrix(nrow = 1, ncol = 2)
AverageMatrix <- rbind(AverageMatrix, Average)
AverageMatrix<- AverageMatrix[-1, , drop = FALSE]

编辑: @akrun 创建一个平均值矩阵并为矩阵的每一列创建一个平均值是相似但技术上不同的问题,因此在我看来这不是重复的。该问题表明我已经知道如何计算矩阵每一列的平均值,并且我想要一种更有效的方法将该结果存储为矩阵,这是另一个问题中未解决的简单问题。

【问题讨论】:

  • 矩阵(平均,nrow = 1,ncol = 2)?
  • matrix(colmeans(df), 1, 2)。请注意,向量在 R 中没有维度。
  • Average &lt;- t(t(colMeans(df, na.rm = TRUE))) ?
  • 非常感谢大家t(colMeans(df, na.rm = TRUE)) 在 1 中复制了我的 4 行代码,正是我所需要的。更喜欢 Allan T 的答案,因为它更简单。想要将其作为回复,以便我可以将问题标记为已回答?

标签: r matrix


【解决方案1】:

您可以通过简单地转置来自colMeans() 的结果来获得列均值的命名矩阵,因为(来自help(t)

当 x 为向量时,将其视为列,即结果为 1 行矩阵。

t(colMeans(df, na.rm = TRUE))
#       Price    XXX
# [1,] 1214.4 1217.9

【讨论】:

    【解决方案2】:

    使用data.table,我们可以遍历列并获取mean(在将'data.frame'转换为'data.table'之后(setDT(df)

    library(data.table)
    setDT(df)[, lapply(.SD, mean, na.rm=TRUE)]
    #   Price    XXX
    #1: 1214.4 1217.9
    

    【讨论】:

      【解决方案3】:

      我使用 dplyr 来处理这样的事情。使用 dplyr 你可以:

      df <- data.frame(Price = c(1219, 1218, 1220, 1216, 1217, 1218, 1218, 1207, 1206, 1205), XXX = c( 1218, 1218, 1219, 1218, 1221,  1217 , 1217, 1216, 1219, 1216))
      
      library(dplyr)
      res <- df %>% summarize(mean(Price), mean(XXX))
      res
      #  mean(Price) mean(XXX)
      #1      1214.4    1217.9
      

      编辑:我忘了你想要它作为矩阵:

      res <- df %>% summarize(mean(Price), mean(XXX)) %>% as.matrix
      

      【讨论】:

      • 非常感谢 AllanT。更喜欢列不更改名称,实际上是在数百列上应用它,因此将使用其他答案之一。不过还是很有用的..
      猜你喜欢
      • 2015-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-28
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多