基于使用R的另一列的条件添加柱

时间:2017-07-26 08:21:48

标签: r

我的数据框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

1 个答案:

答案 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