【发布时间】:2015-09-28 08:55:32
【问题描述】:
我想对 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)))
)
方式 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]
方式 3: 这行得通,但我需要指定这个长表达式两次
dt3 <- dt[,(which(sapply(dt, class)=='character')):=lapply(.SD, as.Date), .SDcols=which(sapply(dt, class)=='character')]
方式 4: 这不起作用,但我想要这样的东西,它允许我只指定一次生成 .SDcols 的变量。我正在寻找某种方法来替换 (.SD):= 用一些有效的东西......或者把东西链接在一起。真的,我很想知道是否有人有一种方法来执行 WAY 1、2、3 中所做的事情,而无需指定使环境膨胀的中间分配,并且不需要两次指定相同的列。
dt3 <- dt[,(.SD):=lapply(.SD, as.Date), .SDcols=which(sapply(dt, class)=='character')]
【问题讨论】:
-
类似于方式 4 的内容当前(发布为)功能请求。
-
@Frank 仅供参考data.table#795
标签: r data.table