如何在data.table

时间:2015-10-30 15:59:35

标签: r data.table large-data

我是data.table的新手,希望有人可以帮我解决这个问题。我将不胜感激

基本上我有一个自定义函数,它取一个日期并返回季度(我不能使用已经可用的季度函数,因为这是用户定义的季度)这是季度函数:

mapQuarters <- function(date){
if(as.Date("2013-12-29") <= date & date <= as.Date("2014-03-29")) {
return(1)
} else if(as.Date("2014-03-30") <= date & date <= as.Date("2014-06-28")){
return(2)
} else if(as.Date("2014-06-29") <= date & date <= as.Date("2014-09-27")){
return(3)
} else if(as.Date("2014-09-28") <= date & date <= as.Date("2014-12-27")){
return(4)
} else return(0)
}

My DT有3 mil行,并希望根据数据中的email_sent_dt添加列qrt。

DT的例子:

数据[1:4]

    rn user_id receipts_id email_sent_dt from_domain order_item_subtotal
1:  1     230     8315895    2014-12-25  AMAZON.COM              100.00
2:  2     230     8315895    2014-12-25  AMAZON.COM              100.00
3:  3     230     6639980    2014-01-26  AMAZON.COM                9.99
4:  4     230     6639981    2014-01-26  AMAZON.COM               11.99

我用于分配季度的代码:

data[,("qrt"):=mapQuarters(email_sent_dt),by=1:nrow(data)]

运行20k行需要36秒,因此运行3密耳行不会节省时间。我想知道是否有人能够提出更有效的解决方案吗?我认为data.table应该对大数据非常好,所以我一定做错了

1 个答案:

答案 0 :(得分:4)

findInterval功能非常灵活,您可以输入每个间隔的极值:

#just to make the example reproducible
require(data.table)
setDT(data)
data[, newCol:= 
       findInterval(email_sent_dt,
       as.Date(c("2013-12-29", "2014-03-29", "2014-06-28", "2014-09-27", "2014-12-27")))]

数据

data<-structure(list(rn = 1:4, user_id = c(230L, 230L, 230L, 230L), 
receipts_id = c(8315895L, 8315895L, 6639980L, 6639981L), 
email_sent_dt = structure(c(16429, 16429, 16096, 16096), class = "Date"), 
from_domain = c("AMAZON.COM", "AMAZON.COM", "AMAZON.COM", 
"AMAZON.COM"), order_item_subtotal = c(100, 100, 9.99, 11.99
)), .Names = c("rn", "user_id", "receipts_id", "email_sent_dt", 
"from_domain", "order_item_subtotal"), row.names = c(NA, -4L), class =    "data.frame")