Reputation: 3720
When using data.table
is it possible to return all the columns except one, like in data.frame
?
If the answer is no, does anyone have an elegant way to transform a multiple time series data.table
to a zoo
or other time series object?
Consider the following example:
library(data.table)
library(zoo)
## DEFINE DATA
set.seed(1)
dt = data.table(
mydates = as.Date("2012-01-01") + 1:9,
value1 = sort(rpois(9, 6)),
value2 = sort(rpois(9, 6)),
value3 = sort(rpois(9, 6)),
value4 = sort(rpois(9, 6)),
value5 = sort(rpois(9, 6)))
## CONVERT TO DATA FRAME
df = as.data.frame(dt)
## CONVERT TO ZOO
zooObj = zoo(df[,-1], df$mydates)
## EXAMPLE OF DESIRED RESULTS
plot(zooObj, col=1:ncol(zooObj))
How would I do that without df = as.data.frame(dt)
?
Upvotes: 60
Views: 35908
Reputation: 465
The previous answer works, but here is the answer with the updated methods:
## CONVERT TO ZOO
#### old method
zooObj = zoo(x=dt[,-1,with=FALSE], order.by=dt$mydates)
#### alternatives
zooObj = zoo(x=dt[,!'mydates'], order.by=dt$mydates)
zooObj = zoo(x=dt[,-'mydates'], order.by=dt$mydates)
#### and if column name is a variable
myvar = 'mydates'
zooObj = zoo(x=dt[,!..myvar], order.by=dt[[myvar]])
zooObj = zoo(x=dt[,-..myvar], order.by=dt[[myvar]])
As an extension, if you wanted to remove more than one column from the data.table
, try one of the following:
dt[,-c('value1', ..myvar)]
dt[, .SD, .SDcols = !c('value1', (myvar))]
Upvotes: 6
Reputation: 59612
Try with=FALSE
:
dt[,-1,with=FALSE]
As an aside, feature request #416 is related :
Add not join DT[-J(...)]
, and not columns DT[,-"colC",with=FALSE]
.
Upvotes: 76