browler.john
browler.john

Reputation: 21

Data.table - Subtract pairs of columns

I'm sorry, this has probably been answered somewhere else. I'm going through someone else's code (without sufficient documentation) and i'm trying to run the following command:

rrd  = rrm[,value:= value[type=="pku"] - value[type=="pk0"] , list(variable)]

rrm is a data.table. As far as I understand I want to calculate the differences of pku and pk0 by type of variable and assign the result to a new column that is named 'value'. However, if I run the command, I get the following error message:

Error in [.data.table(rrm, , := (value, { : Supplied 10 items to be assigned to group 1 of size 20 in column 'value'. The RHS length must either be 1 (single values are ok) or match the LHS length exactly. If you wish to 'recycle' the RHS please use rep() explicitly to make this intent clear to readers of your code.

Is there any workaround/solution to this error?

This is my data:

print.data.frame(rrm)

 type variable       value
1    pk0     mean 10.18634967
2    pku     mean 10.19177697
3    pk0     mean 10.18323074
4    pku     mean 10.18338736
5    pk0     mean 10.17690302
6    pku     mean 10.17663512
7    pk0     mean 10.21680005
8    pku     mean 10.21574084
9    pk0     mean 10.18142407
10   pku     mean 10.18245526
11   pk0     mean 10.18865703
12   pku     mean 10.18993432
13   pk0     mean 10.18469411
14   pku     mean 10.18178037
15   pk0     mean 10.18555337
16   pku     mean 10.18447134
17   pk0     mean 10.17899505
18   pku     mean 10.17634073
19   pk0     mean 10.17541841
20   pku     mean 10.17374883
21   pk0   median 10.12543247
22   pku   median 10.13716609
23   pk0   median 10.12054280
24   pku   median 10.13694067
25   pk0   median 10.12060491
26   pku   median 10.13753156
27   pk0   median 10.12023764
28   pku   median 10.13806559
29   pk0   median 10.12172742
30   pku   median 10.13700781
31   pk0   median 10.12619102
32   pku   median 10.14314559
33   pk0   median 10.12053163
34   pku   median 10.14318633
35   pk0   median 10.12393058
36   pku   median 10.13973191
37   pk0   median 10.11843975
38   pku   median 10.13463409
39   pk0   median 10.11573985
40   pku   median 10.12658083
41   pk0       d1  9.83848047
42   pku       d1  9.85121517
43   pk0       d1  9.83260865
44   pku       d1  9.85146830
45   pk0       d1  9.81911924
46   pku       d1  9.82988272
47   pk0       d1  9.83539816
48   pku       d1  9.84955729
49   pk0       d1  9.82875994
50   pku       d1  9.84850104
51   pk0       d1  9.84339190
52   pku       d1  9.86068047
53   pk0       d1  9.82926417
54   pku       d1  9.82470032
55   pk0       d1  9.83447069
56   pku       d1  9.85030651
57   pk0       d1  9.83186515
58   pku       d1  9.85001546
59   pk0       d1  9.82491390
60   pku       d1  9.81850133
61   pk0       d9 10.64305012
62   pku       d9 10.62249295
63   pk0       d9 10.64863033
64   pku       d9 10.59728566
65   pk0       d9 10.64945397
66   pku       d9 10.61090461
67   pk0       d9 10.70287971
68   pku       d9 10.68832242
69   pk0       d9 10.65037572
70   pku       d9 10.60638526
71   pk0       d9 10.64889921
72   pku       d9 10.61344703
73   pk0       d9 10.64698026
74   pku       d9 10.61538660
75   pk0       d9 10.65100799
76   pku       d9 10.61024106
77   pk0       d9 10.62840893
78   pku       d9 10.57098697
79   pk0       d9 10.62886659
80   pku       d9 10.62228710
81   pk0      var  0.13861818
82   pku      var  0.15092039
83   pk0      var  0.13358830
84   pku      var  0.12118053
85   pk0      var  0.14075433
86   pku      var  0.13094447
87   pk0      var  0.23091842
88   pku      var  0.20692249
89   pk0      var  0.13479935
90   pku      var  0.12513323
91   pk0      var  0.13331305
92   pku      var  0.12879185
93   pk0      var  0.13504633
94   pku      var  0.13580084
95   pk0      var  0.13449477
96   pku      var  0.11868215
97   pk0      var  0.13353367
98   pku      var  0.12953169
99   pk0      var  0.13668670
100  pku      var  0.14617279
101  pk0  var_eps  0.04579254
102  pku  var_eps  0.07386206
103  pk0  var_eps  0.03936571
104  pku  var_eps  0.04443490
105  pk0  var_eps  0.04138806
106  pku  var_eps  0.05209369
107  pk0  var_eps  0.08396788
108  pku  var_eps  0.09311348
109  pk0  var_eps  0.03867605
110  pku  var_eps  0.04699705
111  pk0  var_eps  0.04505027
112  pku  var_eps  0.05448253
113  pk0  var_eps  0.03982819
114  pku  var_eps  0.06146928
115  pk0  var_eps  0.04107385
116  pku  var_eps  0.04364253
117  pk0  var_eps  0.04020068
118  pku  var_eps  0.05265849
119  pk0  var_eps  0.04064481
120  pku  var_eps  0.06567682
121  pk0 var_pred  0.09282564
122  pku var_pred  0.07705833
123  pk0 var_pred  0.09422258
124  pku var_pred  0.07674563
125  pk0 var_pred  0.09936627
126  pku var_pred  0.07885078
127  pk0 var_pred  0.14695054
128  pku var_pred  0.11380901
129  pk0 var_pred  0.09612330
130  pku var_pred  0.07813618
131  pk0 var_pred  0.08826278
132  pku var_pred  0.07430932
133  pk0 var_pred  0.09521814
134  pku var_pred  0.07433156
135  pk0 var_pred  0.09342092
136  pku var_pred  0.07503962
137  pk0 var_pred  0.09333300
138  pku var_pred  0.07687320
139  pk0 var_pred  0.09604189
140  pku var_pred  0.08049596

EDIT:

Thank you for your answers. The issue was the version of the data.table package. The code provided above was written under version 1.12.0, I was using 1.12.8. After installing the old version there were no issues with the original code.

Upvotes: 2

Views: 142

Answers (1)

chinsoon12
chinsoon12

Reputation: 25208

Not sure if I understand your requirements correctly, as there might be a issue with taking difference without first ensuring that you are taking the correct 2 elements for differencing.

But if you assume that the order is always correct (i.e. difference between every 2 rows), an option is to convert a wide format before taking the difference:

library(data.table)
rrm[order(variable, type), g := rowid(type)]
dcast(rrm, variable + g ~ type, value.var="value")[, d := pku - pk0][]

output:

    variable  g         pk0         pku           d
 1:       d1  1  9.83848047  9.85121517  0.01273470
 2:       d1  2  9.83260865  9.85146830  0.01885965
 3:       d1  3  9.81911924  9.82988272  0.01076348
 4:       d1  4  9.83539816  9.84955729  0.01415913
 5:       d1  5  9.82875994  9.84850104  0.01974110
 6:       d1  6  9.84339190  9.86068047  0.01728857
 7:       d1  7  9.82926417  9.82470032 -0.00456385
 8:       d1  8  9.83447069  9.85030651  0.01583582
 9:       d1  9  9.83186515  9.85001546  0.01815031
10:       d1 10  9.82491390  9.81850133 -0.00641257
11:       d9 11 10.64305012 10.62249295 -0.02055717
12:       d9 12 10.64863033 10.59728566 -0.05134467
13:       d9 13 10.64945397 10.61090461 -0.03854936
14:       d9 14 10.70287971 10.68832242 -0.01455729
15:       d9 15 10.65037572 10.60638526 -0.04399046
16:       d9 16 10.64889921 10.61344703 -0.03545218
17:       d9 17 10.64698026 10.61538660 -0.03159366
18:       d9 18 10.65100799 10.61024106 -0.04076693
19:       d9 19 10.62840893 10.57098697 -0.05742196
20:       d9 20 10.62886659 10.62228710 -0.00657949
21:     mean 21 10.18634967 10.19177697  0.00542730
22:     mean 22 10.18323074 10.18338736  0.00015662
23:     mean 23 10.17690302 10.17663512 -0.00026790
24:     mean 24 10.21680005 10.21574084 -0.00105921
25:     mean 25 10.18142407 10.18245526  0.00103119
26:     mean 26 10.18865703 10.18993432  0.00127729
27:     mean 27 10.18469411 10.18178037 -0.00291374
28:     mean 28 10.18555337 10.18447134 -0.00108203
29:     mean 29 10.17899505 10.17634073 -0.00265432
30:     mean 30 10.17541841 10.17374883 -0.00166958
31:   median 31 10.12543247 10.13716609  0.01173362
32:   median 32 10.12054280 10.13694067  0.01639787
33:   median 33 10.12060491 10.13753156  0.01692665
34:   median 34 10.12023764 10.13806559  0.01782795
35:   median 35 10.12172742 10.13700781  0.01528039
36:   median 36 10.12619102 10.14314559  0.01695457
37:   median 37 10.12053163 10.14318633  0.02265470
38:   median 38 10.12393058 10.13973191  0.01580133
39:   median 39 10.11843975 10.13463409  0.01619434
40:   median 40 10.11573985 10.12658083  0.01084098
41:      var 41  0.13861818  0.15092039  0.01230221
42:      var 42  0.13358830  0.12118053 -0.01240777
43:      var 43  0.14075433  0.13094447 -0.00980986
44:      var 44  0.23091842  0.20692249 -0.02399593
45:      var 45  0.13479935  0.12513323 -0.00966612
46:      var 46  0.13331305  0.12879185 -0.00452120
47:      var 47  0.13504633  0.13580084  0.00075451
48:      var 48  0.13449477  0.11868215 -0.01581262
49:      var 49  0.13353367  0.12953169 -0.00400198
50:      var 50  0.13668670  0.14617279  0.00948609
51:  var_eps 51  0.04579254  0.07386206  0.02806952
52:  var_eps 52  0.03936571  0.04443490  0.00506919
53:  var_eps 53  0.04138806  0.05209369  0.01070563
54:  var_eps 54  0.08396788  0.09311348  0.00914560
55:  var_eps 55  0.03867605  0.04699705  0.00832100
56:  var_eps 56  0.04505027  0.05448253  0.00943226
57:  var_eps 57  0.03982819  0.06146928  0.02164109
58:  var_eps 58  0.04107385  0.04364253  0.00256868
59:  var_eps 59  0.04020068  0.05265849  0.01245781
60:  var_eps 60  0.04064481  0.06567682  0.02503201
61: var_pred 61  0.09282564  0.07705833 -0.01576731
62: var_pred 62  0.09422258  0.07674563 -0.01747695
63: var_pred 63  0.09936627  0.07885078 -0.02051549
64: var_pred 64  0.14695054  0.11380901 -0.03314153
65: var_pred 65  0.09612330  0.07813618 -0.01798712
66: var_pred 66  0.08826278  0.07430932 -0.01395346
67: var_pred 67  0.09521814  0.07433156 -0.02088658
68: var_pred 68  0.09342092  0.07503962 -0.01838130
69: var_pred 69  0.09333300  0.07687320 -0.01645980
70: var_pred 70  0.09604189  0.08049596 -0.01554593
    variable  g         pk0         pku           d

Upvotes: 2

Related Questions