calculer la moyenne pour chaque colonne D'une matrice en R

je travaille sur R In R studio. Je dois calculer la moyenne pour chaque colonne d'une base de données.

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

j'ai :

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

Mais je peux utiliser

  mean(cluster1[[1]])

pour obtenir la moyenne de la première colonne.

Comment obtenir des moyens pour toutes les colonnes ?

Toute aide serait appréciée.

42
demandé sur Roman Luštrik 2014-02-16 10:13:46

6 réponses

Vous pouvez utiliser 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 
50
répondu A5C1D2H2I1M1N2O1R2T1 2014-02-16 06:15:17

Vous pouvez utiliser 'appliquer' pour exécuter une fonction ou les lignes ou les colonnes d'une matrice ou de données numériques de châssis:

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
19
répondu bob 2014-02-16 07:30:51

Dans le cas où vous avez de NA:

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

rappelez-vous que le" moyen " nécessite des données numériques. Si vous avez mélangé les données de la classe, puis utilisez:

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
répondu Gonzalo user7334982 2017-01-23 15:34:40

une Autre façon est d'utiliser purrr paquet

# 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
répondu 2016-07-17 11:54:23

Pour la diversité: une Autre façon est d'convertit un vecteur fonction de celui qui fonctionne avec des données cadres en utilisant 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
0
répondu Aaghaz Hussain 2018-03-04 15:42:28

Vous pouvez essayer ceci:

mean(as.matrix(cluster1))
0
répondu weijia 2018-06-11 13:40:59