簡體   English   中英

如何在data.table中使用自定義函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM