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

R 使用.SDcols跨data.table中的列子集应用函数,r,data.table,R,Data.table,我想在data.table中的变量子集上应用函数。在本例中,我只是简单地更改变量类型。我可以在data.table中使用几种不同的方法来实现这一点,但是我正在寻找一种不需要中间赋值(mycols在本例中)并且不需要我指定要更改两次的列的方法。以下是一个简化的可复制示例: library('data.table') n<-30 dt <- data.table(a=sample(1:5, n, replace=T), b=as.character(sample(seq(a

我想在data.table中的变量子集上应用函数。在本例中,我只是简单地更改变量类型。我可以在data.table中使用几种不同的方法来实现这一点,但是我正在寻找一种不需要中间赋值(
mycols
在本例中)并且不需要我指定要更改两次的列的方法。以下是一个简化的可复制示例:

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)))
)
方式3:这是可行的,但我需要指定这个长表达式两次

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

这里有一个简单的答案

for (j in  which(sapply(dt, class)=='character')) set(dt, i=NULL, j=j, value=as.Date(dt[[j]]))
这里有一个问题,Arun和Matt都喜欢使用
for
循环而不是使用
.SD


类似于way 4的内容目前(发布为)是一个功能请求。@Frank仅供参考
dt3 <- dt[,(which(sapply(dt, class)=='character')):=lapply(.SD, as.Date), .SDcols=which(sapply(dt, class)=='character')]
dt3 <- dt[,(.SD):=lapply(.SD, as.Date), .SDcols=which(sapply(dt, class)=='character')]
for (j in  which(sapply(dt, class)=='character')) set(dt, i=NULL, j=j, value=as.Date(dt[[j]]))