如何在 data.table 中使用自定义函数

How to use custom function in data.table

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

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

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)
}

我的 DT 有 300 万行,想根据数据中的 email_sent_dt 添加一列 qrt。

设备标识符示例:

数据[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 秒,因此 运行 300 万行的时间效率不高。我想知道是否有人可以为此提出更有效的解决方案?我以为data.table应该对大数据很好,所以一定是我做错了

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")