2014-02-16 35 views
35

Ich arbeite an R in R Studio. Ich muss den Mittelwert für jede Spalte eines Datenrahmens berechnen.berechnen Sie den Mittelwert für jede Spalte einer Matrix in R

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

Ich habe:

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

Aber ich

mean(cluster1[[1]]) 

zu bekommen den Mittelwert der ersten Spalte verwenden können.

Wie bekomme ich Mittel für alle Spalten?

Jede Hilfe wäre willkommen.

+2

Bitte versuchen Sie es zu finde Antworten, bevor du Fragen stellst. Eine schnelle [Websuche] (https://www.google.com.au/search?q=r+column+means&oq=r+column+means) für 'r column means' ergibt einen sehr relevanten ersten Treffer. Weitere nützliche Selbsthilfe-Tools sind die integrierten ['appropos'] (http://stat.ethz.ch/R-manual/R-patched/library/utils/html/apropos.html) (zB' apropos ('mean') ') und [' findFn'] (http://www.inside-r.org/packages/cran/sos/docs/findFn) im 'sos'-Paket. – jbaums

+0

Auch [diese große Referenzkarte] (http://cran.r-project.org/doc/contrib/Baggott-refcard-v2.pdf). – jbaums

Antwort

41

können Sie colMeans verwenden:

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

Was ist, wenn wir den "Median", oder "min", "max" berechnen möchten? Haben wir so etwas wie 'colMedians'? – AnhTriet

+0

@AnhTriet, vielleicht über das Paket ["matrixStats"] (https://cran.r-project.org/web/packages/matrixStats/index.html) nachdenken? – A5C1D2H2I1M1N2O1R2T1

+0

Danke. Ist es möglich mit Datenrahmen zu arbeiten? – AnhTriet

19

Sie verwenden können ‚anwenden‘ eine Funktion oder die Zeilen oder Spalten einer Matrix oder numerischen Datenrahmen auszuführen:

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

Besser, wenn Sie stattdessen 'colMeans (m)' und 'rowMeans (m)' verwenden. Es ist optimiert und schneller als 'apply (cluster1,1, mean)' – Rentrop

4

Eine andere Möglichkeit ist es, verwenden purrr Paket

# example data like what is said above 

@A Handcart Und 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 
3

Falls Sie NA:

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

Denken Sie daran, dass "meine" numerische Daten benötigt. Wenn Sie Klassendaten gemischt haben, dann verwenden:

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

Für Vielfalt: Eine andere Möglichkeit ist eine Vektorfunktion zu eins umwandelt, die mit Daten Rahmen arbeitet unter Verwendung 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 
Verwandte Themen