2015-06-19 2 views
5

Просто интересно, можно ли вычислить средства для нескольких столбцов, просто используя среднюю функциювычислить среднее значение для нескольких столбцов в data.frame

например.

mean(iris[,1]) 

возможно, но не

mean(iris[,1:4]) 

пытался:

mean(iris[,c(1:4)]) 

получил сообщение об ошибке:

предупреждение: В mean.default (ирис [, 1 : 4]): аргумент не числовой или логический: return ИНГ Н.А.

Я знаю, что я могу просто использовать lapply (ирис [, 1: 4], среднее) или sapply (ирис [, 1: 4], средний)

+6

Как насчет 'colMeans (iris [, 1: 4])'. Принимая среднее значение data.frame, устарели. Я не уверен, почему вы ожидаете, что это сработает, когда вы уже знаете о решениях 'sapply/lapply'. – MrFlick

+0

Используйте подход '? ColMeans' или' apply', но, возможно, для такого вопроса лучшим будет поиск stackoverflow. – SabDeM

ответ

6

Попробуйте colMeans:

Но столбец должен быть числовым. Вы можете добавить тест для больших наборов данных.

colMeans(iris[sapply(iris, is.numeric)]) 
Sepal.Length Sepal.Width Petal.Length Petal.Width 
    5.843333  3.057333  3.758000  1.199333 

Benchmark

Кажется долго dplyr и data.table. Возможно, кто-то может воспроизвести результаты для достоверности.

microbenchmark(
    plafort = colMeans(big.df[sapply(big.df, is.numeric)]), 
    Carlos = colMeans(Filter(is.numeric, big.df)), 
    Cdtable = big.dt[, lapply(.SD, mean)], 
    Cdplyr = big.df %>% summarise_each(funs(mean)) 
) 
#Unit: milliseconds 
# expr  min  lq  mean median  uq  max 
# plafort 9.862934 10.506778 12.07027 10.699616 11.16404 31.23927 
# Carlos 9.215143 9.557987 11.30063 9.843197 10.21821 65.21379 
# Cdtable 57.157250 64.866996 78.72452 67.633433 87.52451 264.60453 
# Cdplyr 62.933293 67.853312 81.77382 71.296555 91.44994 182.36578 

данных

m <- matrix(1:1e6, 1000) 
m2 <- matrix(rep('a', 1000), ncol=1) 
big.df <- as.data.frame(cbind(m2, m), stringsAsFactors=F) 
big.df[,-1] <- lapply(big.df[,-1], as.numeric) 
big.dt <- as.data.table(big.df) 
+0

Спасибо, я слишком долго держался с ним, возвращая списки. –

+0

@ user20650 'colMeans (Фильтр (is.numeric, iris))' –

+0

@CarlosCinelli; nice .. я никогда, кажется, не использую это, и Negate и т. д. и т. д., смотря на Filter, это просто unlist (lapply (..)), но снова succunct – user20650

3

С sapply + Filter:

sapply(Filter(is.numeric, iris), mean) 
Sepal.Length Sepal.Width Petal.Length Petal.Width 
    5.843333  3.057333  3.758000  1.199333 

С dplyr:

library(dplyr) 
iris %>% summarise_each(funs(mean)) 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1:  5.843333 3.057333  3.758 1.199333  NA 

W Ith data.table:

library(data.table) 
iris <- data.table(iris) 
iris[,lapply(.SD, mean)] 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1:  5.843333 3.057333  3.758 1.199333  NA 
+1

Возможно, 'iris%>% summaryise_each (funs (mean), -Species)' –

1

Ваше вышеупомянутое решение делает работу в предположении, что столбцы в правильном is.numeric формате. См. Ниже пример:

a <- c(1,2,3) 
mean(a) 

b <- c(2,4,6) 
mean(b) 

d <- c(3,6,9) 

mydata <- cbind(b,a,d) 


mean(mydata[,1:3]) 
+1

Это не совсем правильно. Вышеприведенный пример представляет собой «data.frame», и нет метода для использования среднего значения в data.frame. Ваш пример (вид) работает так, как вы можете принять среднее значение 'matrix' (' class (mydata) '): но оно дает общее среднее значение, а не столбцы. – user20650

Смежные вопросы