2013-04-19 5 views
3

Я хочу, чтобы выбрать другое подмножество в dataframe из каждого столбца и делать, и в среднем, как этотвыбрать подмножество различных data.frame столбцов

per <- data.frame(Apocal=c(10,1,2,3,4,0,6),Aporos=c(0,2,1,3,0,5,6),Euker=c(0,3,5,7,0,0,0), fecha=c(1,1,2,2,2,3,3)) 

temp <-with(per, per[Apocal>0,]) 
require(plyr) 
temp <- ddply(temp, .(fecha), summarise, Apocal = mean(Apocal)) 

temp <-with(per, per[Aporos>0,]) 
temp <- ddply(temp, .(fecha), summarise, Aporos = mean(Aporos)) 

... 

И повторяю для каждого столбца, за исключением Fecha, есть ли способ автоматизировать это с помощью функции или другой вещи?

Спасибо!

ответ

3

С aggregate:

aggregate(. ~ fecha, data = per, function(x)mean(x[x > 0])) 
# fecha Apocal Aporos Euker 
# 1  1 5.5 2.0  3 
# 2  2 3.0 2.0  6 
# 3  3 6.0 5.5 NaN 
1

Если ваша функция mean, вы можете использовать функцию colMeans нормально. Он вычисляет среднее значение для всех столбцов (по столбцам). Но так как вам требуется, чтобы вычислить среднее после удаления 0 записей каждого столбца, вы можете использовать colSums следующим образом:

# x gets all columns grouped by `fecha`. 
ddply(per, .(fecha), function(x) colSums(x[, -4])/colSums(x[, -4] != 0)) 
# fecha Apocal Aporos Euker 
# 1  1 5.5 2.0  3 
# 2  2 3.0 2.0  6 
# 3  3 6.0 5.5 NaN 
+0

вы забыли, что OP хочет отфильтровать '0', прежде чем принимать средства. – flodel

+0

@flodel, да, я подозревал, что у меня что-то не так. Спасибо, что указали это. Ред. – Arun

1
pmean <- function(x,byvar){ 
    y=x[,-1*byvar] 
    colSums(y*(y>0))/colSums(y>0) 
} 

ddply(per, .(fecha), function(x) pmean(x,4)) 

модифицированную версию soluton Аруна.

+0

'colSums (y)/colSums (y> 0)' достаточно, no? Добавление записей 'y = 0' не повлияет на сумму числителя. – Arun

+0

@Arun, а если, когда некоторые y отрицательны? say 'y = c (-1,0,1)' – vinux

+0

Я не знаю почему, но я предположил, что '>' не является предполагаемым оператором, а скорее '! ='. Если могут быть отрицательные значения, это плохой пример из OP, и ваш ответ намного приятнее, чтобы его охватить! Я скоро удалю свой пост. – Arun

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