3

我想从每一列中选择一个不同的数据框子集,然后像这样进行平均

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,有没有办法用一个函数或其他东西来自动化这个?

谢谢!

4

3 回答 3

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
于 2013-04-19T17:19:56.603 回答
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
于 2013-04-19T16:56:01.560 回答
1
pmean <- function(x,byvar){
  y=x[,-1*byvar]
  colSums(y*(y>0))/colSums(y>0)
}

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

Arun 解决方案的修改版本。

于 2013-04-19T17:23:06.613 回答