Chcę wybrać inny podzbiór ramek danych z każdej kolumny i zrobić i tak średnio
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))
...
I powtórzyć dla każdej kolumny, z wyjątkiem fecha, czy istnieje sposób automatyzacji tego za pomocą funkcji lub innej rzeczy?
Dzięki!
Odpowiedzi:
3 dla odpowiedzi № 1Z 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 dla odpowiedzi nr 2
pmean <- function(x,byvar){
y=x[,-1*byvar]
colSums(y*(y>0))/colSums(y>0)
}
ddply(per, .(fecha), function(x) pmean(x,4))
Zmodyfikowana wersja solutona Arun.
1 dla odpowiedzi nr 3
Jeśli twoja funkcja jest mean
możesz użyć tej funkcji colMeans
normalnie. Oblicza średnią ze wszystkich kolumn (zgodnie z kolumną). Ale ponieważ musisz obliczyć średnią po usunięcie wszystkich wpisów w kolumnie 0, możesz użyć colSums
następująco:
# 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