条件求和(R)

Jur*_*ura 4 conditional r sum

我正在尝试创建条件和,以便计算平均值.我们的想法是函数(或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函数,我忽略了?)

任何想法都非常受欢迎,

问候,

koh*_*ske 9

可能是首先删除未使用的行然后聚合它们的简单方法:

aggregate(TradeResult.Currency.~Instrument,
  mean,
  data=subset(tmpData,TradeResult.Currency.>0))
Run Code Online (Sandbox Code Playgroud)


mds*_*ner 5

你几乎就在那里,我认为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