[英]How to use custom function in data.table
我是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)
}
我的DT有3百萬行,並希望根據數據中的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)]
運行2萬行需要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")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.