Fast table pivoting from long to wide and from wide to long.
These functions are supported by dcast.data.table
and melt.data.table
from data.table.
longer(.data, ..., name = "name", value = "value", na.rm = FALSE) wider(.data, ..., name, value = NULL, fun = NULL, fill = NA)
.data | A data.table |
---|---|
... | Columns for unchanged group. Flexible, see examples. |
name | Name for the measured variable names column. |
value | Name for the data values column(s). |
na.rm | If |
fun | Should the data be aggregated before casting?
Defaults to |
fill | Value with which to fill missing cells. Default uses |
A data.table
stocks <- data.table( time = as.Date('2009-01-01') + 0:9, X = rnorm(10, 0, 1), Y = rnorm(10, 0, 2), Z = rnorm(10, 0, 4) ) stocks %>% longer(time)#> time name value #> <Date> <fctr> <num> #> 1: 2009-01-01 X -1.400043517 #> 2: 2009-01-02 X 0.255317055 #> 3: 2009-01-03 X -2.437263611 #> 4: 2009-01-04 X -0.005571287 #> 5: 2009-01-05 X 0.621552721 #> 6: 2009-01-06 X 1.148411606 #> 7: 2009-01-07 X -1.821817661 #> 8: 2009-01-08 X -0.247325302 #> 9: 2009-01-09 X -0.244199607 #> 10: 2009-01-10 X -0.282705449 #> 11: 2009-01-01 Y -1.107398767 #> 12: 2009-01-02 Y 1.257964084 #> 13: 2009-01-03 Y 4.130049791 #> 14: 2009-01-04 Y -3.261978804 #> 15: 2009-01-05 Y 1.024853900 #> 16: 2009-01-06 Y -3.726022984 #> 17: 2009-01-07 Y -1.044025029 #> 18: 2009-01-08 Y -0.105203820 #> 19: 2009-01-09 Y 1.085992685 #> 20: 2009-01-10 Y -1.828149655 #> 21: 2009-01-01 Z 1.872617682 #> 22: 2009-01-02 Z 1.451805023 #> 23: 2009-01-03 Z -5.218174180 #> 24: 2009-01-04 Z 2.951105285 #> 25: 2009-01-05 Z 7.554019717 #> 26: 2009-01-06 Z -0.389780418 #> 27: 2009-01-07 Z -3.743389414 #> 28: 2009-01-08 Z -0.063801245 #> 29: 2009-01-09 Z -3.307155815 #> 30: 2009-01-10 Z -6.049598605 #> time name valuestocks %>% longer(-(2:4)) # same#> time name value #> <Date> <fctr> <num> #> 1: 2009-01-01 X -1.400043517 #> 2: 2009-01-02 X 0.255317055 #> 3: 2009-01-03 X -2.437263611 #> 4: 2009-01-04 X -0.005571287 #> 5: 2009-01-05 X 0.621552721 #> 6: 2009-01-06 X 1.148411606 #> 7: 2009-01-07 X -1.821817661 #> 8: 2009-01-08 X -0.247325302 #> 9: 2009-01-09 X -0.244199607 #> 10: 2009-01-10 X -0.282705449 #> 11: 2009-01-01 Y -1.107398767 #> 12: 2009-01-02 Y 1.257964084 #> 13: 2009-01-03 Y 4.130049791 #> 14: 2009-01-04 Y -3.261978804 #> 15: 2009-01-05 Y 1.024853900 #> 16: 2009-01-06 Y -3.726022984 #> 17: 2009-01-07 Y -1.044025029 #> 18: 2009-01-08 Y -0.105203820 #> 19: 2009-01-09 Y 1.085992685 #> 20: 2009-01-10 Y -1.828149655 #> 21: 2009-01-01 Z 1.872617682 #> 22: 2009-01-02 Z 1.451805023 #> 23: 2009-01-03 Z -5.218174180 #> 24: 2009-01-04 Z 2.951105285 #> 25: 2009-01-05 Z 7.554019717 #> 26: 2009-01-06 Z -0.389780418 #> 27: 2009-01-07 Z -3.743389414 #> 28: 2009-01-08 Z -0.063801245 #> 29: 2009-01-09 Z -3.307155815 #> 30: 2009-01-10 Z -6.049598605 #> time name valuestocks %>% longer(-"X|Y|Z") # same#> time name value #> <Date> <fctr> <num> #> 1: 2009-01-01 X -1.400043517 #> 2: 2009-01-02 X 0.255317055 #> 3: 2009-01-03 X -2.437263611 #> 4: 2009-01-04 X -0.005571287 #> 5: 2009-01-05 X 0.621552721 #> 6: 2009-01-06 X 1.148411606 #> 7: 2009-01-07 X -1.821817661 #> 8: 2009-01-08 X -0.247325302 #> 9: 2009-01-09 X -0.244199607 #> 10: 2009-01-10 X -0.282705449 #> 11: 2009-01-01 Y -1.107398767 #> 12: 2009-01-02 Y 1.257964084 #> 13: 2009-01-03 Y 4.130049791 #> 14: 2009-01-04 Y -3.261978804 #> 15: 2009-01-05 Y 1.024853900 #> 16: 2009-01-06 Y -3.726022984 #> 17: 2009-01-07 Y -1.044025029 #> 18: 2009-01-08 Y -0.105203820 #> 19: 2009-01-09 Y 1.085992685 #> 20: 2009-01-10 Y -1.828149655 #> 21: 2009-01-01 Z 1.872617682 #> 22: 2009-01-02 Z 1.451805023 #> 23: 2009-01-03 Z -5.218174180 #> 24: 2009-01-04 Z 2.951105285 #> 25: 2009-01-05 Z 7.554019717 #> 26: 2009-01-06 Z -0.389780418 #> 27: 2009-01-07 Z -3.743389414 #> 28: 2009-01-08 Z -0.063801245 #> 29: 2009-01-09 Z -3.307155815 #> 30: 2009-01-10 Z -6.049598605 #> time name valuelong_stocks = longer(stocks,"ti") # same as above except for assignment long_stocks %>% wider(time,name = "name",value = "value")#> Key: <time> #> time X Y Z #> <Date> <num> <num> <num> #> 1: 2009-01-01 -1.400043517 -1.1073988 1.87261768 #> 2: 2009-01-02 0.255317055 1.2579641 1.45180502 #> 3: 2009-01-03 -2.437263611 4.1300498 -5.21817418 #> 4: 2009-01-04 -0.005571287 -3.2619788 2.95110529 #> 5: 2009-01-05 0.621552721 1.0248539 7.55401972 #> 6: 2009-01-06 1.148411606 -3.7260230 -0.38978042 #> 7: 2009-01-07 -1.821817661 -1.0440250 -3.74338941 #> 8: 2009-01-08 -0.247325302 -0.1052038 -0.06380125 #> 9: 2009-01-09 -0.244199607 1.0859927 -3.30715581 #> 10: 2009-01-10 -0.282705449 -1.8281497 -6.04959861# the unchanged group could be missed if all the rest will be used long_stocks %>% wider(name = "name",value = "value")#> Key: <time> #> time X Y Z #> <Date> <num> <num> <num> #> 1: 2009-01-01 -1.400043517 -1.1073988 1.87261768 #> 2: 2009-01-02 0.255317055 1.2579641 1.45180502 #> 3: 2009-01-03 -2.437263611 4.1300498 -5.21817418 #> 4: 2009-01-04 -0.005571287 -3.2619788 2.95110529 #> 5: 2009-01-05 0.621552721 1.0248539 7.55401972 #> 6: 2009-01-06 1.148411606 -3.7260230 -0.38978042 #> 7: 2009-01-07 -1.821817661 -1.0440250 -3.74338941 #> 8: 2009-01-08 -0.247325302 -0.1052038 -0.06380125 #> 9: 2009-01-09 -0.244199607 1.0859927 -3.30715581 #> 10: 2009-01-10 -0.282705449 -1.8281497 -6.04959861