【问题标题】:Percent diff between first in sequence and each successive序列中的第一个和每个连续的之间的百分比差异
【发布时间】:2017-08-25 10:05:41
【问题描述】:

我在数据框中有数据序列,我想对序列中的第一个数字和每个连续数字执行百分比变化计算,这是在响应列中匹配 +1。它将第一个数字保存在数据中,并循环遍历每个数字,并使用数据列在第一个数字和每个连续数字之间取得百分比差异。当响应 = 0 时,百分比差异将停止。

    response    data    output
1    0          98.92     0
2    0          99.92     0
3    0          101.12    0
4    0          101.24    0
5    1          100.96    0
6    1          101.76    0.00792393
7    1          101.96    0.009904913
8    1          101.88    0.00911252
9    1          101.8     0.008320127
10    1         101.6     0.006339144
11    1         101.08    0.00118859
12    1         101.28    0.003169572
13    1         101.76    0.00792393
14    1         105.2     0.04199683
15    1         105.72    0.047147385
16    1         106.00    0.049920761
17    1         105.96    0.049524564
18    1         106.2     0.051901743
19    1         105.12    0.041204437
20    1         106.00    0.049920761
21    1         106.18    0.051703645
22    1         106.56    0.055467512
23    1         107.16    0.06141046
24    1         106.53    0.055170365
25    1         105.6     0.045958796
26    1         106.00    0.049920761
27    1         105.44    0.04437401
28    1         105.6     0.045958796
29    1         104.84    0.038431062
30    0         104.68    0
31    0         105.12    0
32    0         105.68    0
33    0         106.28    0
34    0         106.32    0
35    0         107.04    0
36    1         107.04    0
37    1         106.8     -0.002242152
38    1         107.04    0
39    1         107.2     0.001494768
40    1         109.16    0.01980568
41    1         109.24    0.020553064
42    1         109.28    0.020926756
43    1         110.28    0.030269058
44    1         110.56    0.032884903
45    1         109.68    0.024663677
46    1         108.48    0.013452915
47    1         107.24    0.00186846
48    1         107.88    0.007847534
49    1         107.84    0.007473842
50    1         107.48    0.004110613
51    0         108.16    0
52    0         108.36    0
53    0         103.28    0
54    0         104.84    0

第 5 行的响应为 1,但是作为其序列中的第一个,没有计算百分比差异。接下来在第 6 行有一个 +1 作为响应,因此将采用 percent diff between data col, line 5 and 6。之后,我们转到第 7 行,它在data col, line 7 and 5 之间进行百分比差异。 data col, 8 and 5 etc... 之间的下一个百分比差异,直到响应为 0...在第 36 行的下一个序列之前它什么都不做。

以上是输出列中带有示例百分比差异的示例数据。

编辑:

我正在尝试这样做,创建一个获取百分比差异的函数...在 enter.long == 1 上记录第一个价格,然后针对第一个值执行百分比差异..

# Calculate % diff
train.set$pct.diff <- function(x){
  d = diff(train.set$Close)
  print(d)
  for (j in 1:nrow(train.set)){
    if (train.set$enter.long[j] == 1)
    PCT[j]=d[j] / train.set$Close [j]
    print(PCT)
  }
  return(PCT)
}

遇到0..需要关闭 仍在努力。

【问题讨论】:

  • 您尝试过哪些不适合您的方法?
  • ave(df$data, df$response, FUN = function(x){(x - x[1]) / x[1]})?

标签: r


【解决方案1】:

数据

我用responsedata组成了2列data.frame

set.seed(1)
df <- data.frame(response=rep(c(0,1,0), each=10),
             data=runif(30)+100)

dplyr 解决方案

response改变值时创建grp;使新列的值等于每组中data 的第一个元素;如果response==1,则计算百分比差异

library(dplyr)
df1 <- df %>%
         mutate(grp = cumsum(lag(response, default=head(response,1)) != response)) %>%     # make groups
         group_by(grp) %>%
         mutate(first = head(data,1)) %>%      # make new column with first element
         mutate(output = ifelse(response==1, (data-first)/first ,0)) %>%   # calculation
         ungroup() %>%
         select(-grp, -first)      # discard intermediate columns

输出

   response     data output
 1        0 100.2655      0
 2        0 100.3721      0
 3        0 100.5729      0
 4        0 100.9082      0
 5        0 100.2017      0
 # etc

【讨论】:

  • Chi Pak - 你就是男人!非常非常感谢你!!! Dplyr看起来超级强大,你知道上面有什么性质的教程吗?
  • cran.r-project.org/web/packages/dplyr/vignettes/… 这说明了一点。因此,在每一系列响应 ==1 上,我们将其设为一个组,并将延迟设置为 1 以错过第一个实例,在第一个响应 == 1 之后,获取数据... next set mutate(first = head(data ,1)) 是数据,1 说 1 是列还是滞后 1?这部分仍然知道它的组,所以它总是首先知道起点?所以首先设置 = 数据...然后在响应组 ==1 上执行 if response == 1, data (rolling) - first / first... next
  • ungroup %>%... 每个响应 ==1 系列或组都会发生这种情况吗?还是在整个系列的结尾处执行?试图理解这一点,我认为它对每个连续的响应进行分组 ==1 系列..并做逻辑..这是正确的吗? != response) 做什么?谢谢!
  • 我不太明白你的第一个问题...关于第二个问题,重要的是要澄清group 的作用。 grp 中的每个唯一变量都将成为一个组。 ungroup 删除任何分组变量,只有在取消选择 grp 列时才需要这样做。 != 表示does not equal
  • 好吧,获取响应 == 1,将它们分组,然后执行逻辑。我认为这是有道理的。它是否在每个连续的响应系列中取消分组 ==1?
猜你喜欢
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 2017-06-22
  • 2010-11-23
  • 1970-01-01
相关资源
最近更新 更多