使用.SDcols在data.table中的列子集中应用函数

时间:2015-07-09 19:35:52

标签: r data.table

我想在data.table中的变量子集上应用函数。在这种情况下,我只是简单地改变变量类型。我可以在data.table中以一些不同的方式执行此操作,但是我正在寻找一种不需要中间分配的方法(在此示例中为mycols)并且不需要我指定列I想改变两次。这是一个简化的可重现的例子:

library('data.table')
n<-30
dt <- data.table(a=sample(1:5, n, replace=T),
       b=as.character(sample(seq(as.Date('2011-01-01'), as.Date('2015-01-01'), length.out=n))),
       c1235=as.character(sample(seq(as.Date('2012-01-01'), as.Date('2013-01-01'), length.out=n))),
       d7777=as.character(sample(seq(as.Date('2012-01-01'), as.Date('2013-01-01'), length.out=n)))
)

WAY 1:这是有效的...但它是硬编码的

mycols <- c('b', 'c1235', 'd7777')
dt1 <- dt[,(mycols):=lapply(.SD, as.Date), .SDcols=mycols]

方式2:这有效...但我需要创建一个中间对象才能使其正常工作(mycols

mycols <- which(sapply(dt, class)=='character')
dt2 <- dt[,(mycols):=lapply(.SD, as.Date), .SDcols=mycols]

WAY 3:这有效,但我需要指定这个长表达式两次

dt3 <- dt[,(which(sapply(dt, class)=='character')):=lapply(.SD, as.Date), .SDcols=which(sapply(dt, class)=='character')]

WAY 4:这不起作用,但我想要这样的东西,只允许我指定一次使.SDcols变量的变量。我正在寻找一些方法来取代(.SD):=一些有用的东西......或者把东西连在一起。真的,我很想知道是否有人有一种方法来执行在WAY 1,2,3中完成的操作,而没有指定一个膨胀环境并且不需要两次指定相同列的中间分配。

dt3 <- dt[,(.SD):=lapply(.SD, as.Date), .SDcols=which(sapply(dt, class)=='character')]

1 个答案:

答案 0 :(得分:7)

这是一个单行答案......

for (j in  which(sapply(dt, class)=='character')) set(dt, i=NULL, j=j, value=as.Date(dt[[j]]))

这是一个问题,其中Arun和Matt各自更喜欢使用set循环for而非使用.SD

How to apply same function to every specified column in a data.table