我的数据框mydata
如下,
ID TS TB TC
1 1.7360 -1 0
2 1.7302 -1 0.254
3 1.7244 0 0.624
4 1.7232 0 0.254
5 1.7208 0 1.25
6 1.7208 0 0
7 1.7208 0 0
8 1.7023 0 0
9 1.6814 0 0
10 1.6768 1 0
11 1.6746 0 6.25
12 1.6503 0 0.2547
13 1.6258 0 0.987
14 1.6190 0 0.3654
15 1.6154 0 0.6251
16 1.6258 0 0.369
17 1.6397 0 0
18 1.6443 0 0
19 1.6491 0 0
20 1.6503 0 0
现在我需要添加/减去TS and TC
的值并创建另一个新列TSC
,其条件是-1
列中TB
然后{{1}直到TSC == TS + TC
中有另一个+1 or -1
,否则如果TB
列中有1
,那么TB
,直到另一个TSC == TS - TC
为止+1 or -1
。此外,有可能在TB
列中的数据框开头0
,然后B
。
以下是我的最终结果
Tsc == TS +TC
答案 0 :(得分:1)
通过构造+1的加法向量和-1来减去它的容易度。那么我们如何构建呢?
首先构造一个向量,用前一个非零替换所有零。通过使用rle
,我们可以构造一个出现-1,1或0次的向量,然后用前一个非零替换零,然后将其反转并得到仅1和-1的向量
在开始时粘贴-1以满足“如果从零开始减去”条件:
> rx = rle(c(-1,mydata$TB))
现在看看零的位置:
> wz = which(rx$values==0)
将零设置为以前的值。
> rx$values[wz]=rx$values[wz-1]
现在扩展到1和-1的向量,砍掉第一个去除-1开始的。另外,将其添加+1,减去-1:
> mydata$TBop = -inverse.rle(rx)[-1]
然后进行操作:
> mydata$TSC=mydata$TS + mydata$TBop*mydata$TC
> mydata
ID TS TB TC TBop TSC
1: 1 1.7360 -1 0.0000 1 1.7360
2: 2 1.7302 -1 0.2540 1 1.9842
3: 3 1.7244 0 0.6240 1 2.3484
4: 4 1.7232 0 0.2540 1 1.9772
5: 5 1.7208 0 1.2500 1 2.9708
6: 6 1.7208 0 0.0000 1 1.7208
7: 7 1.7208 0 0.0000 1 1.7208
8: 8 1.7023 0 0.0000 1 1.7023
9: 9 1.6814 0 0.0000 1 1.6814
10: 10 1.6768 1 0.0000 -1 1.6768
11: 11 1.6746 0 6.2500 -1 -4.5754
12: 12 1.6503 0 0.2547 -1 1.3956
13: 13 1.6258 0 0.9870 -1 0.6388
14: 14 1.6190 0 0.3654 -1 1.2536
15: 15 1.6154 0 0.6251 -1 0.9903
16: 16 1.6258 0 0.3690 -1 1.2568
17: 17 1.6397 0 0.0000 -1 1.6397
18: 18 1.6443 0 0.0000 -1 1.6443
19: 19 1.6491 0 0.0000 -1 1.6491
20: 20 1.6503 0 0.0000 -1 1.6503
可能最好为操作员编写可测试的功能:
Top <-
function(x){
rx = rle(c(-1,x))
wz = which(rx$values==0)
rx$values[wz] = rx$values[wz-1]
-inverse.rle(rx)[-1]
}
然后你可以查看简单的例子:
> Top(0) # add
[1] 1
> Top(-1) # add
[1] 1
> Top(1) # subtract
[1] -1
> Top(c(0,-1,1,-1,0,0,0))
[1] 1 1 -1 1 1 1 1 # add, add, sub, add, add, add, add
> Top(mydata$TB)
[1] 1 1 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
然后你的解决方案是单行的:
> mydata$TSC = mydata$TS + Top(mydata$TB) * mydata$TC