geneorama
geneorama

Reputation: 3720

How to exclude one column from data.table OR convert to data.table to MTS

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

Answers (2)

TMo
TMo

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

Matt Dowle
Matt Dowle

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

Related Questions