(window.webpackJsonp=window.webpackJsonp||[]).push([[2876],{3284:function(t,a,s){"use strict";s.r(a);var e=s(31),n=Object(e.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"data-table"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#data-table"}},[t._v("#")]),t._v(" data.table")]),t._v(" "),s("p",[t._v("Data.table is a package that extends the functionality of data frames from base R, particularly improving on their performance and syntax. See the package's Docs area at "),s("a",{attrs:{href:"http://stackoverflow.com/documentation/data.table/3389",target:"_blank",rel:"noopener noreferrer"}},[t._v("Getting started with data.table"),s("OutboundLink")],1),t._v(" for details.")]),t._v(" "),s("h2",{attrs:{id:"creating-a-data-table"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-data-table"}},[t._v("#")]),t._v(" Creating a data.table")]),t._v(" "),s("p",[t._v("A data.table is an enhanced version of the data.frame class from base R. As such, its "),s("code",[t._v("class()")]),t._v(" attribute is the vector "),s("code",[t._v('"data.table" "data.frame"')]),t._v(" and functions that work on a data.frame will also work with a data.table. There are many ways to create, load or coerce to a data.table.")]),t._v(" "),s("h3",{attrs:{id:"build"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#build"}},[t._v("#")]),t._v(" Build")]),t._v(" "),s("p",[t._v("Don't forget to install and activate the "),s("code",[t._v("data.table")]),t._v(" package")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("library"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data.table"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("p",[t._v("There is a constructor of the same name:")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("DT "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" data.table"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n x "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" letters"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n y "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n z "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# x y z")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 1: a 1 FALSE")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 2: b 2 FALSE")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 3: c 3 FALSE")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 4: d 4 TRUE")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 5: e 5 TRUE")]),t._v("\n\n")])])]),s("p",[t._v("Unlike "),s("code",[t._v("data.frame")]),t._v(", "),s("code",[t._v("data.table")]),t._v(" will not coerce strings to factors:")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("sapply"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DT"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" class"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# x y z ")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# "character" "integer" "logical" ')]),t._v("\n\n")])])]),s("h3",{attrs:{id:"read-in"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#read-in"}},[t._v("#")]),t._v(" Read in")]),t._v(" "),s("p",[t._v("We can read from a text file:")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("dt "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" fread"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"my_file.csv"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("p",[t._v("Unlike "),s("code",[t._v("read.csv")]),t._v(", "),s("code",[t._v("fread")]),t._v(" will read strings as strings, not as factors.")]),t._v(" "),s("h3",{attrs:{id:"modify-a-data-frame"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#modify-a-data-frame"}},[t._v("#")]),t._v(" Modify a data.frame")]),t._v(" "),s("p",[t._v("For efficiency, data.table offers a way of altering a data.frame or list to make a data.table in-place (without making a copy or changing its memory location):")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# example data.frame")]),t._v("\nDF "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" data.frame"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" letters"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" y "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" z "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# modification")]),t._v("\nsetDT"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DF"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("p",[t._v("Note that we do not "),s("code",[t._v("<-")]),t._v(" assign the result, since the object "),s("code",[t._v("DF")]),t._v(" has been modified in-place. The class attributes of the data.frame will be retained:")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("sapply"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DF"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" class"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# x y z ")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# "factor" "integer" "logical" ')]),t._v("\n\n")])])]),s("h3",{attrs:{id:"coerce-object-to-data-table"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#coerce-object-to-data-table"}},[t._v("#")]),t._v(" Coerce object to data.table")]),t._v(" "),s("p",[s("strong",[t._v("If you have a "),s("code",[t._v("list")]),t._v(", "),s("code",[t._v("data.frame")]),t._v(", or "),s("code",[t._v("data.table")]),t._v(", you should use the "),s("code",[t._v("setDT")]),t._v(" function")]),t._v(" to convert to a "),s("code",[t._v("data.table")]),t._v(" because it does the conversion by reference instead of making a copy (which "),s("code",[t._v("as.data.table")]),t._v(" does). This is important if you are working with large datasets.")]),t._v(" "),s("p",[t._v("If you have another R object (such as a matrix), you must use "),s("code",[t._v("as.data.table")]),t._v(" to coerce it to a "),s("code",[t._v("data.table")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("mat "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" matrix"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ncol "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nrow "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nDT "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" as.data.table"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mat"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or")]),t._v("\nDT "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" data.table"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mat"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("h2",{attrs:{id:"special-symbols-in-data-table"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#special-symbols-in-data-table"}},[t._v("#")]),t._v(" Special symbols in data.table")]),t._v(" "),s("h3",{attrs:{id:"sd"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#sd"}},[t._v("#")]),t._v(" .SD")]),t._v(" "),s("p",[s("code",[t._v(".SD")]),t._v(" refers to the subset of the "),s("code",[t._v("data.table")]),t._v(" for each group, excluding all columns used in "),s("code",[t._v("by")]),t._v(".")]),t._v(" "),s("p",[s("code",[t._v(".SD")]),t._v(" along with "),s("code",[t._v("lapply")]),t._v(" can be used to apply any function to multiple columns by group in a "),s("code",[t._v("data.table")])]),t._v(" "),s("p",[t._v("We will continue using the same built-in dataset, "),s("code",[t._v("mtcars")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("mtcars "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data.table"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mtcars"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Let's not include rownames to keep things simpler")]),t._v("\n\n")])])]),s("p",[t._v("Mean of all columns in the dataset by "),s("strong",[t._v("number of cylinders")]),t._v(", "),s("code",[t._v("cyl")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("mtcars"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" lapply"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v(".SD"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" mean"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" by "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cyl"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# cyl mpg disp hp drat wt qsec vs am gear carb")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#1: 6 19.74286 183.3143 122.28571 3.585714 3.117143 17.97714 0.5714286 0.4285714 3.857143 3.428571")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#2: 4 26.66364 105.1364 82.63636 4.070909 2.285727 19.13727 0.9090909 0.7272727 4.090909 1.545455")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#3: 8 15.10000 353.1000 209.21429 3.229286 3.999214 16.77214 0.0000000 0.1428571 3.285714 3.500000")]),t._v("\n\n")])])]),s("p",[t._v("Apart from "),s("code",[t._v("cyl")]),t._v(", there are other categorical columns in the dataset such as "),s("code",[t._v("vs")]),t._v(", "),s("code",[t._v("am")]),t._v(", "),s("code",[t._v("gear")]),t._v(" and "),s("code",[t._v("carb")]),t._v(". It doesn't really make sense to take the "),s("code",[t._v("mean")]),t._v(" of these columns. So let's exclude these columns. This is where "),s("code",[t._v(".SDcols")]),t._v(" comes into the picture.")]),t._v(" "),s("h3",{attrs:{id:"sdcols"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#sdcols"}},[t._v("#")]),t._v(" .SDcols")]),t._v(" "),s("p",[s("code",[t._v(".SDcols")]),t._v(" specifies the columns of the "),s("code",[t._v("data.table")]),t._v(" that are included in "),s("code",[t._v(".SD")]),t._v(".")]),t._v(" "),s("p",[t._v("Mean of all columns (continuous columns) in the dataset by "),s("strong",[t._v("number of gears")]),t._v(" "),s("code",[t._v("gear")]),t._v(", and "),s("strong",[t._v("number of cylinders")]),t._v(", "),s("code",[t._v("cyl")]),t._v(", arranged by "),s("code",[t._v("gear")]),t._v(" and "),s("code",[t._v("cyl")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# All the continuous variables in the dataset")]),t._v("\ncols_chosen "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mpg"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"disp"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"hp"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"drat"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wt"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"qsec"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nmtcars"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("order"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gear"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cyl"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" lapply"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v(".SD"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" mean"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" by "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ."),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gear"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cyl"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" .SDcols "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cols_chosen"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# gear cyl mpg disp hp drat wt qsec")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#1: 3 4 21.500 120.1000 97.0000 3.700000 2.465000 20.0100")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#2: 3 6 19.750 241.5000 107.5000 2.920000 3.337500 19.8300")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#3: 3 8 15.050 357.6167 194.1667 3.120833 4.104083 17.1425")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#4: 4 4 26.925 102.6250 76.0000 4.110000 2.378125 19.6125")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#5: 4 6 19.750 163.8000 116.5000 3.910000 3.093750 17.6700")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#6: 5 4 28.200 107.7000 102.0000 4.100000 1.826500 16.8000")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#7: 5 6 19.700 145.0000 175.0000 3.620000 2.770000 15.5000")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#8: 5 8 15.400 326.0000 299.5000 3.880000 3.370000 14.5500")]),t._v("\n\n")])])]),s("p",[t._v("Maybe we don't want to calculate the "),s("code",[t._v("mean")]),t._v(" by groups. To calculate the mean for all the cars in the dataset, we don't specify the "),s("code",[t._v("by")]),t._v(" variable.")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("mtcars"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" lapply"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v(".SD"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" mean"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" .SDcols "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cols_chosen"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" \n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# mpg disp hp drat wt qsec")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#1: 20.09062 230.7219 146.6875 3.596563 3.21725 17.84875")]),t._v("\n\n")])])]),s("p",[t._v("Note:")]),t._v(" "),s("ul",[s("li",[t._v("It is not necessary to define "),s("code",[t._v("cols_chosen")]),t._v(" beforehand. "),s("code",[t._v(".SDcols")]),t._v(" can directly take column names")]),t._v(" "),s("li",[s("code",[t._v(".SDcols")]),t._v(" can also directly take a vector of columnnumbers. In the above example this would be "),s("code",[t._v("mtcars[ , lapply(.SD, mean), .SDcols = c(1,3:7)]")])])]),t._v(" "),s("h3",{attrs:{id:"n"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#n"}},[t._v("#")]),t._v(" .N")]),t._v(" "),s("p",[s("code",[t._v(".N")]),t._v(" is shorthand for the number of rows in a group.")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("iris"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ."),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("count"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(".N"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" by"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("Species"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Species count")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#1: setosa 50")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#2: versicolor 50")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#3: virginica 50")]),t._v("\n\n")])])]),s("h2",{attrs:{id:"adding-and-modifying-columns"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#adding-and-modifying-columns"}},[t._v("#")]),t._v(" Adding and modifying columns")]),t._v(" "),s("p",[s("code",[t._v("DT[where, select|update|do, by]")]),t._v(" syntax is used to work with columns of a data.table.")]),t._v(" "),s("ul",[s("li",[t._v('The "where" part is the '),s("code",[t._v("i")]),t._v(" argument")]),t._v(" "),s("li",[t._v('The "select|update|do" part is the '),s("code",[t._v("j")]),t._v(" argument")])]),t._v(" "),s("p",[t._v("These two arguments are usually passed by position instead of by name.")]),t._v(" "),s("p",[t._v("Our example data below is")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("mtcars "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" data.table"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mtcars"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" keep.rownames "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("TRUE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("h3",{attrs:{id:"editing-entire-columns"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#editing-entire-columns"}},[t._v("#")]),t._v(" Editing entire columns")]),t._v(" "),s("p",[t._v("Use the "),s("code",[t._v(":=")]),t._v(" operator inside "),s("code",[t._v("j")]),t._v(" to assign new columns:")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("mtcars"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" mpg_sq "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mpg"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("^")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\n")])])]),s("p",[t._v("Remove columns by setting to "),s("code",[t._v("NULL")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("mtcars"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" mpg_sq "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("NULL")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\n")])])]),s("p",[t._v("Add multiple columns by using the "),s("code",[t._v(":=")]),t._v(" operator's multivariate format:")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("mtcars"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" `"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("`"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mpg_sq "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mpg"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("^")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" wt_sqrt "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" sqrt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or ")]),t._v("\nmtcars"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mpg_sq"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wt_sqrt"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ."),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mpg"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("^")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" sqrt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("wt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\n")])])]),s("p",[t._v("If the columns are dependent and must be defined in sequence, one way is:")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("mtcars"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mpg_sq"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mpg2_hp"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ."),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("temp1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" mpg"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("^")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" temp1"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("hp"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\n")])])]),s("p",[t._v("The "),s("code",[t._v(".()")]),t._v(" syntax is used when the right-hand side of "),s("code",[t._v("LHS := RHS")]),t._v(" is a list of columns.")]),t._v(" "),s("p",[t._v("For dynamically-determined column names, use parentheses:")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("vn "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mpg_sq"')]),t._v("\nmtcars"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("vn"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mpg"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("^")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\n")])])]),s("p",[t._v("Columns can also be modified with "),s("code",[t._v("set")]),t._v(", though this is rarely necessary:")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("set"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mtcars"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" j "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"hp_over_wt"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" v "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" mtcars"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("hp"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v("mtcars"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("wt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("h3",{attrs:{id:"editing-subsets-of-columns"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#editing-subsets-of-columns"}},[t._v("#")]),t._v(" Editing subsets of columns")]),t._v(" "),s("p",[t._v("Use the "),s("code",[t._v("i")]),t._v(' argument to subset to rows "where" edits should be made:')]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("mtcars"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" newvar "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Hello"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or")]),t._v("\nset"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mtcars"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" j "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"newvar"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" i "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" v "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Hello"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n\n")])])]),s("p",[t._v('As in a data.frame, we can subset using row numbers or logical tests. It is also possible to use a "join" in '),s("code",[t._v("i")]),t._v(", but that more complicated task is covered in another example.")]),t._v(" "),s("h3",{attrs:{id:"editing-column-attributes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#editing-column-attributes"}},[t._v("#")]),t._v(" Editing column attributes")]),t._v(" "),s("p",[t._v("Functions that edit attributes, such as "),s("code",[t._v("levels<-")]),t._v(" or "),s("code",[t._v("names<-")]),t._v(", actually replace an object with a modified copy. Even if only used on one column in a data.table, the entire object is copied and replaced.")]),t._v(" "),s("p",[t._v("To modify an object without copies, use "),s("code",[t._v("setnames")]),t._v(" to change the column names of a data.table or data.frame and "),s("code",[t._v("setattr")]),t._v(" to change an attribute for any object.")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Print a message to the console whenever the data.table is copied")]),t._v("\ntracemem"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mtcars"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nmtcars"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cyl2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" factor"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cyl"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Neither of these statements copy the data.table")]),t._v("\nsetnames"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mtcars"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" old "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cyl2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" new "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cyl_fac"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nsetattr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mtcars"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("cyl_fac"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"levels"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"four"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"six"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"eight"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Each of these statements copies the data.table")]),t._v("\nnames"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mtcars"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("names"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mtcars"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cyl_fac"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"cf"')]),t._v("\nlevels"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mtcars"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("cf"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"IV"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VI"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"VIII"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("p",[t._v("Be aware that these changes are made by reference, so they are "),s("strong",[t._v("global")]),t._v(". Changing them within one environment affects the object in all environments.")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# This function also changes the levels in the global environment")]),t._v("\nedit_levels "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" setattr"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"levels"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"low"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"med"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"high"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nedit_levels"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mtcars"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("cyl_factor"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("h2",{attrs:{id:"writing-code-compatible-with-both-data-frame-and-data-table"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#writing-code-compatible-with-both-data-frame-and-data-table"}},[t._v("#")]),t._v(" Writing code compatible with both data.frame and data.table")]),t._v(" "),s("h3",{attrs:{id:"differences-in-subsetting-syntax"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#differences-in-subsetting-syntax"}},[t._v("#")]),t._v(" Differences in subsetting syntax")]),t._v(" "),s("p",[t._v("A "),s("code",[t._v("data.table")]),t._v(" is one of several two-dimensional data structures available in R, besides "),s("code",[t._v("data.frame")]),t._v(", "),s("code",[t._v("matrix")]),t._v(" and (2D) "),s("code",[t._v("array")]),t._v(". All of these classes use a very similar but not identical syntax for subsetting, the "),s("code",[t._v("A[rows, cols]")]),t._v(" schema.")]),t._v(" "),s("p",[t._v("Consider the following data stored in a "),s("code",[t._v("matrix")]),t._v(", a "),s("code",[t._v("data.frame")]),t._v(" and a "),s("code",[t._v("data.table")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("ma "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" matrix"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rnorm"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nrow"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dimnames"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("list"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("letters"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'X'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Y'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Z'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndf "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" as.data.frame"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ma"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndt "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" as.data.table"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ma"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nma"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#---\x3e returns the 2nd and 3rd items, as if 'ma' were a vector (because it is!)")]),t._v("\ndf"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#---\x3e returns the 2nd and 3rd columns")]),t._v("\ndt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#---\x3e returns the 2nd and 3rd rows!")]),t._v("\n\n")])])]),s("p",[t._v("If you want to be sure of what will be returned, it is better to be "),s("strong",[t._v("explicit")]),t._v(".")]),t._v(" "),s("p",[t._v("To get specific "),s("strong",[t._v("rows")]),t._v(", just add a comma after the range:")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("ma"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# \\")]),t._v("\ndf"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# }---\x3e returns the 2nd and 3rd rows")]),t._v("\ndt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# /")]),t._v("\n\n")])])]),s("p",[t._v("But, if you want to subset "),s("strong",[t._v("columns")]),t._v(", some cases are interpreted differently. All\nthree can be subset the same way with integer or character indices "),s("strong",[t._v("not")]),t._v(" stored in a\nvariable.")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("ma"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# \\")]),t._v("\ndf"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# \\")]),t._v("\ndt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# }---\x3e returns the 2nd and 3rd columns")]),t._v("\nma"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Y"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Z"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# /")]),t._v("\ndf"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Y"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Z"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# /")]),t._v("\ndt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Y"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Z"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# /")]),t._v("\n\n")])])]),s("p",[t._v("However, they differ for unquoted variable names")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("mycols "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v("\nma"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" mycols"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# \\")]),t._v("\ndf"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" mycols"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# }---\x3e returns the 2nd and 3rd columns")]),t._v("\ndt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" mycols"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" with "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("FALSE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# /")]),t._v("\n\ndt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" mycols"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# ---\x3e Raises an error")]),t._v("\n\n")])])]),s("p",[t._v("In the last case, "),s("code",[t._v("mycols")]),t._v(" is evaluated as the name of a column. Because "),s("code",[t._v("dt")]),t._v(" cannot find\na column named "),s("code",[t._v("mycols")]),t._v(", an error is raised.")]),t._v(" "),s("p",[t._v("Note: For versions of the "),s("code",[t._v("data.table")]),t._v(" package priorto 1.9.8, this behavior was slightly\ndifferent. Anything in the column index would have been evaluated using "),s("code",[t._v("dt")]),t._v(" as an\nenvironment. So both "),s("code",[t._v("dt[, 2:3]")]),t._v(" and "),s("code",[t._v("dt[, mycols]")]),t._v(" would return the vector "),s("code",[t._v("2:3")]),t._v(". No\nerror would be raised for the second case, because the variable "),s("code",[t._v("mycols")]),t._v(" does exist in\nthe parent environment.")]),t._v(" "),s("h3",{attrs:{id:"strategies-for-maintaining-compatibility-with-data-frame-and-data-table"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#strategies-for-maintaining-compatibility-with-data-frame-and-data-table"}},[t._v("#")]),t._v(" Strategies for maintaining compatibility with data.frame and data.table")]),t._v(" "),s("p",[t._v("There are many reasons to write code that is guaranteed to work with "),s("code",[t._v("data.frame")]),t._v(" and "),s("code",[t._v("data.table")]),t._v(". Maybe you are forced to use "),s("code",[t._v("data.frame")]),t._v(", or you may need to share some code that you don't know how will be used. So, there are some main strategies for achieving this, in order of convenience:")]),t._v(" "),s("ol",[s("li",[t._v("Use syntax that behaves the same for both classes.")]),t._v(" "),s("li",[t._v("Use a common function that does the same thing as the shortest syntax.")]),t._v(" "),s("li",[t._v("Force "),s("code",[t._v("data.table")]),t._v(" to behave as "),s("code",[t._v("data.frame")]),t._v(" (ex.: call the specific method "),s("code",[t._v("print.data.frame")]),t._v(").")]),t._v(" "),s("li",[t._v("Treat them as "),s("code",[t._v("list")]),t._v(", which they ultimately are.")]),t._v(" "),s("li",[t._v("Convert the table to a "),s("code",[t._v("data.frame")]),t._v(" before doing anything (bad idea if it is a huge table).")]),t._v(" "),s("li",[t._v("Convert the table to "),s("code",[t._v("data.table")]),t._v(", if dependencies are not a concern.")])]),t._v(" "),s("p",[s("strong",[t._v("Subset rows.")]),t._v(" Its simple, just use the "),s("code",[t._v("[, ]")]),t._v(" selector, "),s("strong",[t._v("with")]),t._v(" the comma:")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("A"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nA"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("A"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("var "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("17")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# A[var > 17, ] just works for data.table")]),t._v("\n\n")])])]),s("p",[s("strong",[t._v("Subset columns.")]),t._v(" If you want a single column, use the "),s("code",[t._v("$")]),t._v(" or the "),s("code",[t._v("[[ ]]")]),t._v(" selector:")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("A"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("var\ncolname "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'var'")]),t._v("\nA"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("colname"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nA"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\n")])])]),s("p",[t._v("If you want a uniform way to grab more than one column, it's necessary to appeal a bit:")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("B "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" `"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(".data.frame`"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("A"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# We can give it a better name")]),t._v("\nselect "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" `"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(".data.frame`\nB "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" select"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("A"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nC "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" select"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("A"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'foo'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'bar'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("p",[s("strong",[t._v("Subset 'indexed' rows.")]),t._v(" While "),s("code",[t._v("data.frame")]),t._v(" has "),s("code",[t._v("row.names")]),t._v(", "),s("code",[t._v("data.table")]),t._v(" has its unique "),s("code",[t._v("key")]),t._v(" feature. The best thing is to avoid "),s("code",[t._v("row.names")]),t._v(" entirely and take advantage of the existing optimizations in the case of "),s("code",[t._v("data.table")]),t._v(" when possible.")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("B "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" A"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("A"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("var "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or...")]),t._v("\nB "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" with"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("A"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" A"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("var "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# data.table will silently index A by var before subsetting")]),t._v("\n\nstuff "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'a'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'c'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'f'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nC "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" A"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("match"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("stuff"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" A"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("$")]),t._v("name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# really worse than: setkey(A); A[stuff, ]")]),t._v("\n\n")])])]),s("p",[s("strong",[t._v("Get a 1-column table, get a row as a vector.")]),t._v(" These are easy with what we have seen until now:")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("B "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" select"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("A"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#---\x3e a table with just the second column")]),t._v("\nC "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" unlist"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("A"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#---\x3e the first row as a vector (coerced if necessary)")]),t._v("\n\n")])])]),s("h2",{attrs:{id:"setting-keys-in-data-table"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#setting-keys-in-data-table"}},[t._v("#")]),t._v(" Setting keys in data.table")]),t._v(" "),s("p",[s("strong",[t._v("Yes, you need to SETKEY pre 1.9.6")])]),t._v(" "),s("p",[t._v("In the past (pre 1.9.6), your "),s("code",[t._v("data.table")]),t._v(" was sped up by setting columns as keys to the table, particularly for large tables. [See "),s("a",{attrs:{href:"http://stackoverflow.com/questions/20039335/what-is-the-purpose-of-setting-a-key-in-data-table",target:"_blank",rel:"noopener noreferrer"}},[t._v("intro vignette page 5"),s("OutboundLink")],1),t._v(" of September 2015 version, where speed of search was 544 times better.] You may find older code making use of this setting keys with 'setkey' or setting a 'key=' column when setting up the table.")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("library"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data.table"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nDT "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" data.table"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n x "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" letters"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n y "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" \n z "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#> DT")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# x y z")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#1: a 5 FALSE")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#2: b 4 FALSE")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#3: c 3 FALSE")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#4: d 2 TRUE")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#5: e 1 TRUE")]),t._v("\n\n")])])]),s("p",[t._v("Set your key with the "),s("code",[t._v("setkey")]),t._v(" command. You can have a key with multiple columns.")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("setkey"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DT"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" y"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("p",[t._v("Check your table's key in tables()")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("tables"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" tables"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n NAME NROW NCOL MB COLS KEY\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" DT "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("y"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("z y \nTotal"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("MB\n\n")])])]),s("p",[t._v("Note this will re-sort your data.")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#> DT")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# x y z")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#1: e 1 TRUE")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#2: d 2 TRUE")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#3: c 3 FALSE")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#4: b 4 FALSE")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#5: a 5 FALSE")]),t._v("\n\n")])])]),s("p",[s("strong",[t._v("Now it is unnecessary")])]),t._v(" "),s("p",[t._v("Prior to v1.9.6 you had to have set a key for certain operations especially joining tables. The developers of data.table have sped up and introduced a "),s("code",[t._v('"on="')]),t._v(" feature that can replace the dependency on keys. See "),s("a",{attrs:{href:"http://stackoverflow.com/questions/20039335/what-is-the-purpose-of-setting-a-key-in-data-table",target:"_blank",rel:"noopener noreferrer"}},[t._v("SO answer here for a detailed discussion."),s("OutboundLink")],1)]),t._v(" "),s("p",[t._v("In Jan 2017, the developers have written a "),s("a",{attrs:{href:"https://cran.r-project.org/web/packages/data.table/vignettes/datatable-secondary-indices-and-auto-indexing.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("vignette around secondary indices"),s("OutboundLink")],1),t._v(' which explains the "on" syntax and allows for other columns to be identified for fast indexing.')]),t._v(" "),s("p",[s("strong",[t._v("Creating secondary indices?")])]),t._v(" "),s("p",[t._v("In a manner similar to key, you can "),s("code",[t._v("setindex(DT, key.col)")]),t._v(" or "),s("code",[t._v('setindexv(DT, "key.col.string")')]),t._v(", where DT is your data.table. Remove all indices with "),s("code",[t._v("setindex(DT, NULL)")]),t._v(".")]),t._v(" "),s("p",[t._v("See your secondary indices with "),s("code",[t._v("indices(DT)")]),t._v(".")]),t._v(" "),s("p",[s("strong",[t._v("Why secondary indices?")])]),t._v(" "),s("p",[t._v("This "),s("strong",[t._v("does not sort")]),t._v(' the table (unlike key), but does allow for quick indexing using the "on" syntax. Note there can be only one key, but you can use multiple secondary indices, which saves having to rekey and resort the table. This will speed up your subsetting when changing the columns you want to subset on.')]),t._v(" "),s("p",[t._v("Recall, in example above y was the key for table DT:")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("DT\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# x y z")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 1: e 1 TRUE")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 2: d 2 TRUE")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 3: c 3 FALSE")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 4: b 4 FALSE")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 5: a 5 FALSE")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Let us set x as index ")]),t._v("\nsetindex"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DT"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Use indices to see what has been set")]),t._v("\nindices"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DT"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# [1] "x"')]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# fast subset using index and not keyed column")]),t._v("\nDT"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"c"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" on "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"x"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#x y z")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#1: c 3 FALSE")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# old way would have been rekeying DT from y to x, doing subset and ")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# perhaps keying back to y (now we save two sorts)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# This is a toy example above but would have been more valuable with big data sets")]),t._v("\n\n")])])]),s("h4",{attrs:{id:"syntax"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#syntax"}},[t._v("#")]),t._v(" Syntax")]),t._v(" "),s("li",[t._v("`DT[i, j, by]`"),s("br"),t._v("\n# DT[where, select|update|do, by]")]),t._v(" "),s("li",[t._v("`DT[...][...]`"),s("br"),t._v("\n# chaining")]),t._v("\n- `################# Shortcuts, special functions and special symbols inside DT[...]`\n"),s("li",[t._v(".()"),s("br"),t._v("\n# in several arguments, replaces list()")]),t._v(" "),s("li",[t._v("J()"),s("br"),t._v("\n# in i, replaces list()")]),t._v(" "),s("li",[t._v(":="),s("br"),t._v("\n# in j, a function used to add or modify columns")]),t._v(" "),s("li",[t._v(".N"),s("br"),t._v("\n# in i, the total number of rows"),s("br"),t._v("\n# in j, the number of rows in a group")]),t._v(" "),s("li",[t._v(".I"),s("br"),t._v("\n# in j, the vector of row numbers in the table (filtered by i)")]),t._v(" "),s("li",[t._v(".SD"),s("br"),t._v("\n# in j, the current subset of the data"),s("br"),t._v("\n# selected by the .SDcols argument")]),t._v(" "),s("li",[t._v(".GRP"),s("br"),t._v("\n# in j, the current index of the subset of the data")]),t._v(" "),s("li",[t._v(".BY"),s("br"),t._v("\n# in j, the list of by values for the current subset of data")]),t._v(" "),s("li",[t._v("V1, V2, ..."),s("br"),t._v("\n# default names for unnamed columns created in j")]),t._v("\n- `################# Joins inside DT[...]`\n"),s("li",[t._v("DT1[DT2, on, j]"),s("br"),t._v("\n# join two tables")]),t._v(" "),s("li",[t._v("i.*"),s("br"),t._v("\n# special prefix on DT2's columns after the join")]),t._v(" "),s("li",[t._v("by=.EACHI"),s("br"),t._v("\n# special option available only with a join")]),t._v(" "),s("li",[t._v("DT1[!DT2, on, j]"),s("br"),t._v("\n# anti-join two tables")]),t._v(" "),s("li",[t._v("DT1[DT2, on, roll, j]"),s("br"),t._v("\n# join two tables, rolling on the last column in on=")]),t._v("\n- `################# Reshaping, stacking and splitting`\n"),s("li",[t._v("melt(DT, id.vars, measure.vars)"),s("br"),t._v("\n# transform to long format"),s("br"),t._v("\n# for multiple columns, use measure.vars = patterns(...)")]),t._v(" "),s("li",[t._v("dcast(DT, formula)"),s("br"),t._v("\n# transform to wide format")]),t._v(" "),s("li",[t._v("rbind(DT1, DT2, ...)"),s("br"),t._v("\n# stack enumerated data.tables")]),t._v(" "),s("li",[t._v("rbindlist(DT_list, idcol)"),s("br"),t._v("\n# stack a list of data.tables")]),t._v(" "),s("li",[t._v("split(DT, by)"),s("br"),t._v("\n# split a data.table into a list")]),t._v("\n- `################# Some other functions specialized for data.tables`\n"),s("li",[t._v("foverlaps"),s("br"),t._v("\n# overlap joins")]),t._v(" "),s("li",[t._v("merge"),s("br"),t._v("\n# another way of joining two tables")]),t._v(" "),s("li",[t._v("set"),s("br"),t._v("\n# another way of adding or modifying columns")]),t._v(" "),s("li",[t._v("fintersect, fsetdiff, funion, fsetequal, unique, duplicated, anyDuplicated"),s("br"),t._v("\n# set-theory operations with rows as elements")]),t._v(" "),s("li",[t._v("uniqueN"),s("br"),t._v("\n# the number of distinct rows")]),t._v(" "),s("li",[t._v("rowidv(DT, cols)"),s("br"),t._v("\n# row ID (1 to .N) within each group determined by cols")]),t._v(" "),s("li",[t._v("rleidv(DT, cols)"),s("br"),t._v("\n# group ID (1 to .GRP) within each group determined by runs of cols")]),t._v(" "),s("li",[t._v('shift(DT, n, type=c("lag", "lead"))'),s("br"),t._v("\n# apply a shift operator to every column")]),t._v(" "),s("li",[t._v("setorder, setcolorder, setnames, setkey, setindex, setattr"),s("br"),t._v("\n# modify attributes and order by reference")]),t._v(" "),s("h4",{attrs:{id:"remarks"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#remarks"}},[t._v("#")]),t._v(" Remarks")]),t._v(" "),s("h3",{attrs:{id:"installation-and-support"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installation-and-support"}},[t._v("#")]),t._v(" Installation and support")]),t._v(" "),s("p",[s("a",{attrs:{href:"https://github.com/Rdatatable/data.table/wiki/Installation",target:"_blank",rel:"noopener noreferrer"}},[t._v("To install"),s("OutboundLink")],1),t._v(" the data.table package:")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# install from CRAN")]),t._v("\ninstall.packages"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"data.table"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# or install development version ")]),t._v("\ninstall.packages"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"data.table"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" type "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"source"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" repos "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://Rdatatable.github.io/data.table"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# and to revert from devel to CRAN, the current version must first be removed")]),t._v("\nremove.packages"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"data.table"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ninstall.packages"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"data.table"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("p",[t._v("The package's "),s("a",{attrs:{href:"https://github.com/Rdatatable/data.table/wiki",target:"_blank",rel:"noopener noreferrer"}},[t._v("official site"),s("OutboundLink")],1),t._v(" has wiki pages providing help getting started, and lists of presentations and articles from around the web. Before asking a question -- here on StackOverflow or anywhere else -- please read "),s("a",{attrs:{href:"https://github.com/Rdatatable/data.table/wiki/Support",target:"_blank",rel:"noopener noreferrer"}},[t._v("the support page"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h3",{attrs:{id:"loading-the-package"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#loading-the-package"}},[t._v("#")]),t._v(" Loading the package")]),t._v(" "),s("p",[t._v("Many of the functions in the examples above exist in the data.table namespace. To use them, you will need to add a line like "),s("code",[t._v("library(data.table)")]),t._v(" first or to use their full path, like "),s("code",[t._v("data.table::fread")]),t._v(" instead of simply "),s("code",[t._v("fread")]),t._v(". For help on individual functions, the syntax is "),s("code",[t._v('help("fread")')]),t._v(" or "),s("code",[t._v("?fread")]),t._v(". Again, if the package is not loaded, use the full name like "),s("code",[t._v("?data.table::fread")]),t._v(".")])])}),[],!1,null,null,null);a.default=n.exports}}]);