我正在尝试创建条件和,以便计算平均值.我们的想法是函数(或apply语句)检查某个值是否为真(例如x> 0),然后将x的所有值加到大于零的值.最后一步是将此总和除以大于零的实例数.搜索条件总和(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
Run Code Online (Sandbox Code Playgroud)
在我尝试过的功能中,以下是最有希望的:
avgProfit <- function(x) {
ifelse(x > 0,
sum(x) / length(which(x > 0)),
return(0))
}
Run Code Online (Sandbox Code Playgroud)
但是,此函数的输出为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
Run Code Online (Sandbox Code Playgroud)
(JPM的值应为225(总计900除以4个大于零的实例)和KFT的116个)
即使我在函数中计算x的总和(如果我理解正确,应该是data.frame中各个值的总和),变量'x'的输出让我感到困惑.我找不到这些1,2,3和4来自哪里.
如何计算条件和?此外,我是否需要使用一个函数或者我是否太复杂了(也许我有一个内置的R函数,我忽略了?)
任何想法都非常受欢迎,
问候,
可能是首先删除未使用的行然后聚合它们的简单方法:
aggregate(TradeResult.Currency.~Instrument,
mean,
data=subset(tmpData,TradeResult.Currency.>0))
Run Code Online (Sandbox Code Playgroud)
你几乎就在那里,我认为ifelse是错误的方向,因为你想要平均值,而不是元素明智的比较.
您将需要考虑是否可能遇到缺失值,因此您可以正确处理.
tmpData <- read.table(textConnection(" 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"))
with(tmpData, tapply(TradeResult.Currency., Instrument, function(x) mean(x[x > 0])))
Run Code Online (Sandbox Code Playgroud)
JPM KFT 225 116
| 归档时间: |
|
| 查看次数: |
22588 次 |
| 最近记录: |