2014-02-16 126 views
35

我正在R studio中使用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]]) 

获得第一列的平均值。

如何获得所有列的手段?

任何帮助,将不胜感激。

+2

请尽量用数据 帧作品在发布问题之前找到答案。 'r专栏意味着'快速[网页搜索](https://www.google.com.au/search?q=r+column+means&oq=r+column+means)产生非常相关的第一击。其他有用的自助工具包括内置的['apropos'](http://stat.ethz.ch/R-manual/R-patched/library/utils/html/apropos.html)(例如'apropos( '')')和['findFn'](http://www.inside-r.org/packages/cran/sos/docs/findFn)放在'sos'包中。 – jbaums

+0

另外[这个伟大的参考卡](http://cran.r-project.org/doc/contrib/Baggott-refcard-v2.pdf)。 – jbaums

回答

41

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

如果我们想计算'中值'或'最小值','最大值',该怎么办?我们有像colMedians这样的东西吗? – AnhTriet

+0

@AnhTriet,也许考虑[“matrixStats”包](https://cran.r-project.org/web/packages/matrixStats/index.html)? – A5C1D2H2I1M1N2O1R2T1

+0

谢谢。可以使用数据框吗? – AnhTriet

19

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

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 
+0

如果使用'colMeans(m)'和'rowMeans(m)'代替,则更好。它比'apply(cluster1,1,mean)'优化并且更快 – Rentrop

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