【问题标题】:Data.table - Subtract pairs of columnsData.table - 减去列对
【发布时间】:2020-02-27 16:32:11
【问题描述】:

对不起,这可能已经在其他地方得到了回答。我正在浏览别人的代码(没有足够的文档),我正在尝试运行以下命令:

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

rrm 是一个数据表。据我了解,我想按变量类型计算 pku 和 pk0 的差异,并将结果分配给名为“值”的新列。但是,如果我运行该命令,则会收到以下错误消息:

[.data.table(rrm, , := (value, { : 提供了 10 个项目以分配给“值”列中大小为 20 的组 1。 RHS 长度必须为 1(单个值即可)或与 LHS 长度完全匹配。如果您希望“回收” RHS,请明确使用 rep() 以向您的代码读者明确这一意图。

这个错误有什么变通方法/解决方案吗?

这是我的数据:

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

编辑:

感谢您的回答。问题是 data.table 包的版本。上面提供的代码是在 1.12.0 版本下编写的,我使用的是 1.12.8。安装旧版本后,原代码没有问题。

【问题讨论】:

  • 我认为这缺少聚合功能。 variabletype 的每个组合都有 10 行,因此 value[type=="pku"] - value[type=="pk0"] 会产生一个 10 长度的向量。如果我们想按variable 分组,我们应该告诉 R 如何总结这 10 个值。或者,如果我们确实希望每个type-variable 有 10 个观察值,我们如何知道应该从哪个值中减去哪个值?
  • 听起来代码依赖于我们会自动回收值的旧行为(例如,如果您有一个包含 20 行的组,并且您返回 10 行,我们会将其复制为 20 行) .我们不再这样做,因为我们认为它容易出现静默错误;建议您查看其他建议以“现代化”代码并使其更安全

标签: r data.table


【解决方案1】:

不确定我是否正确理解了您的要求,因为在没有首先确保您采用正确的 2 个元素进行差异的情况下进行差异可能会出现问题。

但是,如果您假设顺序始终正确(即每 2 行之间的差异),则可以选择在获取差异之前转换宽格式:

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

输出:

    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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    相关资源
    最近更新 更多