【发布时间】:2011-05-20 20:10:51
【问题描述】:
我正在尝试创建一个条件总和,以计算平均值。这个想法是一个函数(或一个 apply 语句)检查某个值是否为真(例如 x > 0),然后将 x 的所有大于零的值相加。最后一步是将这个总和除以大于零的实例数。搜索条件 sum(ming) 没有给我有用的信息。
这是数据的一部分:
> tmpData
Instrument TradeResult.Currency.
1 JPM -3
2 JPM 264
3 JPM 284
4 JPM 69
5 JPM 283
11 KFT -8
12 KFT -48
13 KFT 125
14 KFT -150
15 KFT -206
16 KFT 107
在我尝试过的功能中,以下是最有希望的:
avgProfit <- function(x) {
ifelse(x > 0,
sum(x) / length(which(x > 0)),
return(0))
}
但是,这个函数的输出是0:
> with(tmpData, tapply(TradeResult.Currency., Instrument, avgProfit))
JPM KFT
0 0
> avgProfit(tmpData$TradeResult.Currency.)
[1] 0
> x
[1] 1 1 2 1 2 3 3 3 4 4
(JPM 的值应为 225(总计 900 除以 4 个大于零的实例),KFT 的值应为 116)
即使我在函数中计算 x 的总和(如果我理解正确,应该是 data.frame 中各个值的总和),变量“x”的输出让我感到困惑。我找不到这些 1、2、3 和 4 的来源。
如何计算条件总和?此外,我需要使用一个函数还是让它太复杂(也许有一个我忽略的内置 R 函数?)
欢迎任何想法,
问候,
【问题讨论】:
-
所以 Instrument 在这里没有任何作用,对吧?
-
嗨 Roman,不,该工具确实在计算每个工具的平均值方面发挥了作用(即 JPM 的平均值,KFT 的平均值)。我认为 Kohske 的子集解决方案是一个优雅的解决方案。感谢您的评论/兴趣!
标签: r conditional sum