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

72

我正在使用 R Studio 进行 R 语言编程。 我需要计算数据框中每一列的均值。

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

我得到了:

  Warning message:
  In mean.default(cluster1) :
  argument is not numeric or logical: returning NA
< p >但我可以使用

  mean(cluster1[[1]])

获取第一列的均值。

如何获取所有列的均值?

任何帮助将不胜感激。


3
有用的自助工具包括内置的apropos(例如apropos('mean'))和sos包中的findFn - jbaums
还有这张很棒的参考卡片 - jbaums
10个回答

90

您可以使用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 

1
如果我们想要计算中位数、最小值、最大值怎么办?我们有像colMedians 这样的东西吗? - Triet Doan
@AnhTriet,也许可以考虑一下"matrixStats"包 - A5C1D2H2I1M1N2O1R2T1
8
如果您有一个数据框并想要计算中位数、标准差等,请使用apply函数:apply(df, 2, median)。这里的'2'表示按列计算。请参考此处链接:https://dev59.com/PWMl5IYBdhLWcg3w3aTj#18047916。 - haff

31

你可以使用 'apply' 运行函数或矩阵/数值数据框的行或列:

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) - Rentrop

12
如果您有缺失值:
sapply(data, mean, na.rm = T)      # Returns a vector (with names)   
lapply(data, mean, na.rm = T)      # Returns a list  

请记住,“mean”需要数值型数据。如果您的数据包含混合类型,则应使用:

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

2
你可以尝试这个方法:
mean(as.matrix(cluster1))

2
另一种方法是使用purrr包。
# example data like what is said above

@手推车和马海毛

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 

2
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 

2

试一下!还可以计算NA的数据!

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

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


# a1   a2
# 5.5 15.5

1

使用collapse包中的fmean函数是另一种选择。以下是一个可重现的示例:

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

输出:

  X1   X2   X3   X4 
47.0 64.4 44.8 67.8

1

0

为了多样性:另一种方法是通过使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接