【问题标题】:Apply function across subset of columns in data.table with .SDcols使用 .SDcols 跨 data.table 中的列子集应用函数
【发布时间】: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


【解决方案1】:

这是一个单行答案...

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2013-12-25
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多