R 顺序中的第一个和每个连续序列之间的差异百分比
我有一个数据帧中的数据序列,在该数据帧中,我希望对序列中的第一个数字和每个连续数字执行%更改计算,这是在响应列中的匹配+1上。它将保存数据中的第一个数字,并使用数据列循环每个数字,取第一个数字和每个连续数字之间的百分比差。当响应=0时,百分比差异将停止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
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