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

R 顺序中的第一个和每个连续序列之间的差异百分比,r,R,我有一个数据帧中的数据序列,在该数据帧中,我希望对序列中的第一个数字和每个连续数字执行%更改计算,这是在响应列中的匹配+1上。它将保存数据中的第一个数字,并使用数据列循环每个数字,取第一个数字和每个连续数字之间的百分比差。当响应=0时,百分比差异将停止 response data output 1 0 98.92 0 2 0 99.92 0 3 0 101.12 0 4 0

我有一个数据帧中的数据序列,在该数据帧中,我希望对序列中的第一个数字和每个连续数字执行%更改计算,这是在响应列中的匹配+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作为响应,以便在第5行和第6行的数据列之间获得
百分比差异。在这之后,我们转到第7行,它在第7行和第5行的
数据列之间进行百分比差异。
数据列、8和5之间的下一个百分比差异…
直到响应为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)
}
#计算%diff
列车设置$pct.diff数据
我用
response
data组成了两列
data.frame

set.seed(1)
df <- data.frame(response=rep(c(0,1,0), each=10),
             data=runif(30)+100)
输出
你试过什么对你不起作用的?
ave(df$data,df$response,FUN=function(x){(x-x[1])/x[1]}
?Chi-Pak-你就是那个人!非常感谢大家!!!Dplyr看起来超级强大,你知道上面的教程吗?这显示了一点。所以对于每个系列的响应==1,我们将其设为一个组,我们将lag设置为1以错过第一个实例,在第一个响应==1之后,获取数据。。。下一个集合mutate(first=head(data,1))是数据,1表示1是列还是滞后1?这是一部分仍然知道它的组,所以它总是首先知道起点?所以先设置=数据。。。然后在response==1的组上执行if response==1,data(rolling)-first/first。。。下一步取消分组%>%。。。是否每个响应==1系列或组都会发生这种情况?还是在整个系列的结尾执行??为了理解这一点,我认为它对每个连续响应进行分组==1个系列。。然后做逻辑运算。。这是正确的吗?这是什么!=回答)你怎么办?谢谢我真的不明白你的第一个问题……关于第二个问题,澄清
小组的工作很重要。
grp
中的每个唯一变量将成为一个组
ungroup
删除任何分组变量,只有取消选择
grp
列时才需要该变量<代码>=
表示
不等于
Ok有意义,获取响应==1,将它们分组,然后执行逻辑。我认为这是有道理的。它是否对每个连续的响应序列进行解组==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