计算 R 中矩阵每一列的平均值

Posted

技术标签:

【中文标题】计算 R 中矩阵每一列的平均值【英文标题】:calculate the mean for each column of a matrix in R 【发布时间】:2014-03-15 12:05:42 【问题描述】:

我正在 R 工作室研究 R。 我需要计算数据框每一列的平均值。

 cluster1  // 5 by 4 data frame
 mean(cluster1) // 

我明白了:

  Warning message:
  In mean.default(cluster1) :
  argument is not numeric or logical: returning NA

但我可以使用

  mean(cluster1[[1]])

获取第一列的平均值。

如何获取所有列的均值?

任何帮助将不胜感激。

【问题讨论】:

有用的自助工具包括内置的apropos(例如apropos('mean'))和sos包中的findFn 还有this great reference card。 【参考方案1】:

你可以使用colMeans:

### Sample data
set.seed(1)
m <- data.frame(matrix(sample(100, 20, replace = TRUE), ncol = 4))

### Your error
mean(m)
# [1] NA
# Warning message:
# In mean.default(m) : argument is not numeric or logical: returning NA

### The result using `colMeans`
colMeans(m)
#   X1   X2   X3   X4 
# 47.0 64.4 44.8 67.8 

【讨论】:

如果我们要计算median,或者minmax怎么办?我们有类似colMedians 的东西吗? @AnhTriet,可以考虑"matrixStats" package? @TrietDoan 如果您有一个数据框并且想要计算中位数、标准差等,请使用 apply:apply(df, 2, median)。这里的“2”表示按列。见这里:***.com/a/18047916/5824031【参考方案2】:

您可以使用“应用”来运行函数或矩阵或数字数据框的行或列:

cluster1 <- data.frame(a=1:5, b=11:15, c=21:25, d=31:35)

apply(cluster1,2,mean)  # applies function 'mean' to 2nd dimension (columns)

apply(cluster1,1,mean)  # applies function to 1st dimension (rows)

sapply(cluster1, mean)  # also takes mean of columns, treating data frame like list of vectors

【讨论】:

如果你改用colMeans(m)rowMeans(m) 会更好。比apply(cluster1,1,mean)优化更快【参考方案3】:

如果您有 NA:

sapply(data, mean, na.rm = T)      # Returns a vector (with names)   
lapply(data, mean, na.rm = T)      # Returns a list  

请记住,“平均值”需要数字数据。如果您有混合类数据,请使用:

numdata<-data[sapply(data, is.numeric)]  
sapply(numdata, mean, na.rm = T)  # Returns a vector
lapply(numdata, mean, na.rm = T)  # Returns a list  

【讨论】:

【参考方案4】:

另一种方法是使用purrr

# example data like what is said above

@A 手推车和马海毛

set.seed(1)
m <- data.frame(matrix(sample(100, 20, replace = TRUE), ncol = 4))


library(purrr)
means <- map_dbl(m, mean)

> means
#  X1   X2   X3   X4 
#47.0 64.4 44.8 67.8 

【讨论】:

【参考方案5】:

你可以试试这个:

mean(as.matrix(cluster1))

【讨论】:

【参考方案6】:

试试吧!还可以计算NA的数据!

df <- data.frame(a1=1:10, a2=11:20)

df %>% summarise_each(funs( mean( .,na.rm = TRUE)))


# a1   a2
# 5.5 15.5

【讨论】:

【参考方案7】:
class(mtcars)
my.mean <- unlist(lapply(mtcars, mean)); my.mean



   mpg        cyl       disp         hp       drat         wt       qsec         vs 
 20.090625   6.187500 230.721875 146.687500   3.596563   3.217250  17.848750   0.437500 
        am       gear       carb 
  0.406250   3.687500   2.812500 

【讨论】:

【参考方案8】:

colMeans(A, na.rm = FALSE, dims = 1)

https://stat.ethz.ch/R-manual/R-devel/library/base/html/colSums.html

这是在基类中,所以不需要库。

第一个答案看起来像是使用分析库中的 colMeans,这在 R 版本 4.0.2 中不可用。

【讨论】:

【参考方案9】:

为了多样性:另一种方法是将向量函数转换为可处理数据的函数 使用plyr::colwise()

set.seed(1)
m <- data.frame(matrix(sample(100, 20, replace = TRUE), ncol = 4))

plyr::colwise(mean)(m)


#   X1   X2   X3   X4
# 1 47 64.4 44.8 67.8

【讨论】:

以上是关于计算 R 中矩阵每一列的平均值的主要内容,如果未能解决你的问题,请参考以下文章

在matlab中如何求两个列矩阵的协方差?

利用pandas和numpy计算表中每一列的均值

如何根据R中另一列的日期(月/日/年)计算列的年/月平均值、最大值、最小值等

用 Python 用该列的平均值减去数据框中的每一列

试图弄清楚如何使用列表返回数据框中每一列的平均值

python Dataframe 对每一列求均值,然后加在最后一行怎么做