我是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应该对大数据非常好,所以我一定做错了
答案 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")