顺序优先和每个连续之间的差异百分比

时间:2017-08-19 15:24:57

标签: r

我在数据框中有数据序列,我想在序列中的第一个数字和每个连续数字执行%更改计算,这是在响应列中匹配+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行的下一个序列之前无效。

以上是输出列中示例%diff的示例数据。

编辑:

我正在尝试这样做,创建一个函数来获取百分比差异...在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时需要关闭.. 还在努力。

1 个答案:

答案 0 :(得分:1)

数据

我用data.frameresponse

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

dplyr解决方案

grp更改值时创建response;使新值的值等于每个组中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