web-dev-qa-db-fra.com

calculer la moyenne pour chaque colonne d'une matrice dans R

Je travaille sur R in R studio . Je dois calculer la moyenne pour chaque colonne d'un bloc de données.

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

J'ai eu : 

  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. 

45
user2420472

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

Vous pouvez utiliser 'apply' pour exécuter une fonction ou les lignes ou colonnes d'une matrice ou d'un bloc de données numériques:

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

Si vous avez des NA:

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

Rappelez-vous que "moyen" a besoin de données numériques. Si vous avez mélangé des données de classe, 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  
6
Gonzalo user7334982

Une autre façon consiste à utiliser purrr package 

# example data like what is said above

@A charrette à bras et mohair

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
user6376316

Vous pouvez essayer ceci:

mean(as.matrix(cluster1))
0
weijia

Pour la diversité: Une autre méthode consiste à convertir une fonction vectorielle en une fonction utilisant des données Images à l'aide de 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
Aaghaz Hussain