【问题标题】:calculate the mean for each column of a matrix in R计算 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]])

获取第一列的平均值。

如何获取所有列的均值?

任何帮助将不胜感激。

【问题讨论】:

标签: r dataframe mean


【解决方案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”表示按列。见这里:stackoverflow.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
              

              【讨论】:

                猜你喜欢
                • 2021-07-24
                • 2013-01-04
                • 2018-09-23
                • 1970-01-01
                • 2018-08-27
                • 1970-01-01
                • 1970-01-01
                • 2017-08-21
                • 1970-01-01
                相关资源
                最近更新 更多