2014-02-16 4 views
35

Я работаю над R в студии 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

Пожалуйста, попробуйте находите ответы перед публикацией вопросов. Быстрый [веб-поиск] (https://www.google.com.au/search?q=r+column+means&oq=r+column+means) для «r-столбцов» дает очень важный первый хит. Другие полезные инструменты самопомощи включают встроенный ['apropos'] (http://stat.ethz.ch/R-manual/R-patched/library/utils/html/apropos.html) (например,' apropos ('mean') ') и [' 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

Что делать, если мы хотим вычислить 'медианный', или' min', 'max'? У нас есть что-то вроде '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 Handcart И мохер

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 
Смежные вопросы