我在数据框中有数据序列,我想在序列中的第一个数字和每个连续数字执行%更改计算,这是在响应列中匹配+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时需要关闭.. 还在努力。
答案 0 :(得分:1)
我用data.frame
和response
data
set.seed(1)
df <- data.frame(response=rep(c(0,1,0), each=10),
data=runif(30)+100)
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