选择不同数据框列的子集

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"列之外,是否有任何自动化的方法可以通过函数或其他方式来完成这个操作?
谢谢!
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

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

你忘了OP想在计算平均值之前过滤掉0 - flodel
@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))

修改版的Arun解决方案。

colSums(y)/colSums(y>0) 就足够了,不是吗?添加 y = 0 条目不会影响分子的总和。 - Arun
@Arun 如果一些y是负数怎么办?比如说 y=c(-1,0,1) - vinux
我不知道为什么,但我认为 > 不是预期的运算符,而是 !=。如果可能存在负值,则这是来自 OP 的糟糕示例,您的答案更好,已经涵盖了它!我很快会删除我的帖子。 - Arun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接