如何将数据表的三列重新整形为打印表

时间:2015-01-05 19:34:50

标签: r dataframe data.table reshape

我想打印一个表,该表包含一列中的行名和第二列中的列名,以及第三列中的表值。

这里是数据表dt的内容。标题是船舶航向,shipSpdKt是船舶速度和kts,V1是表格值。

    heading shipSpdKt          V1
 1:       0         5  -4.3057799
 2:      30         5  -4.2452984
 3:      60         5  -5.6391077
 4:      90         5  -4.9353771
 5:     120         5  -4.3519821
 6:     150         5  -2.3346472
 7:     180         5  -1.6274207
 8:       0        10  -6.0007901
 9:      30        10  -6.7137480
10:      60        10  -6.9774241
11:      90        10  -5.7268767
12:     120        10  -3.9167585
13:     150        10  -1.8365736
14:     180        10  -1.1103727
15:       0        20  -6.4556379
16:      30        20  -7.3609538
17:      60        20 -11.3018260
18:      90        20  -7.7640429
19:     120        20  -4.7670283
20:     150        20  -1.7899857
21:     180        20  -0.9479594
22:       0        30  -4.2182927
23:      30        30  -5.8362999
24:      60        30  -8.9905834
25:      90        30  -7.2139764
26:     120        30  -5.1285415
27:     150        30  -2.2860508
28:     180        30  -0.8197407

我想要像

这样的东西
print(dt)

生成一个打印的表格,显示航向和船速值的V1值。这是一个显示所需输出的部分表。

           shipSpdKt    
heading            5             10          20          30
      0       -4.305         -6.000      -6.455      -4.218
     30       -4.245
     60       -5.639
     90       -4.935
    120       -4.351
    150       -2.334
    180       -1.627

这是我最初的尝试,但它并没有产生所需的表格

reshape(dt,v.names='heading',idvar='shipSpdKt',timevar="heading",direction="wide")

输出

   shipSpdKt       V1 heading.0 heading.30 heading.60 heading.90 heading.120 heading.150
1:         5 4.505957         0         30         60         90         120         150
2:        10 5.683579         0         30         60         90         120         150
3:        20 6.427269         0         30         60         90         120         150
4:        30 3.961622         0         30         60         90         120         150
   heading.180
1:         180
2:         180
3:         180
4:         180

1 个答案:

答案 0 :(得分:1)

使用基础reshape功能:

reshape(dt, timevar = "shipSpdKt", idvar = "heading", direction = "wide")

使用reshape2包:

reshape2::dcast(dt, heading ~ shipSpdKt, value.var = "V1")

使用tidyr包:

tidyr::spread(dt, shipSpdKt, V1)

使用data.table包:

data.table::dcast.data.table(dt, heading ~ shipSpdKt, value.var = "V1")