顺序中的第一个和每个连续的百分比差异



>我在数据框中有数据序列,我想对序列中的第一个数字和每个连续的数字执行百分比变化计算,这是在响应列中匹配+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.. 时需要关闭。 仍在努力。

data

我用responsedata组成了 2 列data.frame

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

滴灌机解决方案

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

最新更新