
Last chance! 50% off unlimited learning
Sale ends in
In data.table
parlance, all set*
functions change their input by reference. That is, no copy is made at all, other than temporary working memory, which is as large as one column.. The only other data.table
operator that modifies input by reference is :=
. Check out the See Also
section below for other set*
function data.table
provides.
setDT
converts lists (both named and unnamed) and data.frames to data.tables by reference. This feature was requested on Stackoverflow.
setDT(x, keep.rownames=FALSE, key=NULL, check.names=FALSE)
The input is modified by reference, and returned (invisibly) so it can be used in compound statements; e.g., setDT(X)[, sum(B), by=A]
. If you require a copy, take a copy first (using DT2 = copy(DT)
). See ?copy
.
A named or unnamed list
, data.frame
or data.table
.
For data.frame
s, TRUE
retains the data.frame
's row names under a new column rn
. keep.rownames = "id"
names the column "id"
instead.
Character vector of one or more column names which is passed to setkeyv
. It may be a single comma separated string such as key="x,y,z"
, or a vector of names such as key=c("x","y","z")
.
Just as check.names
in data.frame
.
When working on large lists
or data.frames
, it might be both time and memory consuming to convert them to a data.table
using as.data.table(.)
, as this will make a complete copy of the input object before to convert it to a data.table
. The setDT
function takes care of this issue by allowing to convert lists
- both named and unnamed lists and data.frames
by reference instead. That is, the input object is modified in place, no copy is being made.
data.table
, as.data.table
, setDF
, copy
, setkey
, setcolorder
, setattr
, setnames
, set
, :=
, setorder
set.seed(45L)
X = data.frame(A=sample(3, 10, TRUE),
B=sample(letters[1:3], 10, TRUE),
C=sample(10), stringsAsFactors=FALSE)
# Convert X to data.table by reference and
# get the frequency of each "A,B" combination
setDT(X)[, .N, by=.(A,B)]
# convert list to data.table
# autofill names
X = list(1:4, letters[1:4])
setDT(X)
# don't provide names
X = list(a=1:4, letters[1:4])
setDT(X, FALSE)
# setkey directly
X = list(a = 4:1, b=runif(4))
setDT(X, key="a")[]
# check.names argument
X = list(a=1:5, a=6:10)
setDT(X, check.names=TRUE)[]
Run the code above in your browser using DataLab